このコードを使用:
template <class T> class Test {
T _temp;
public:
Test() {
std::cout << "Test()" << std::endl;
};
template <class T2> Test(Test<T2> const &test) {
std::cout << "template <class T2> Test(Test<T2> const &test)" << std::endl;
};
template <class T2> Test(Test<T2> &&test) {
std::cout << "template <class T2> Test(Test<T2> &&test)" << std::endl;
};
};
このテストコードで:
Test<int> testInt;
Test<float> testFloat(testInt);
Test<float> testFloat2(std::move(testInt));
std::cout << "----------" << std::endl;
Test<int> testInt2;
Test<int> testInt3(testInt2);
Test<int> testInt4(std::move(testInt2));
この出力を生成します:
Test()
template <class T2> Test(Test<T2> const &test)
template <class T2> Test(Test<T2> &&test)
----------
Test()
同じ型を使用する場合は、変換コンストラクターの代わりに、既定のコピー コンストラクターと移動コンストラクターが使用されます。
しかし、クラスにデフォルトのコピーコンストラクターを追加すると:
Test(Test const &test) = default;
次の出力が生成されます。
Test()
template <class T2> Test(Test<T2> const &test)
template <class T2> Test(Test<T2> &&test)
----------
Test()
template <class T2> Test(Test<T2> &&test)
同じ型でも移動変換コンストラクタが呼び出されるのはなぜですか?
コードの重複を避けるために、コピーと変換コンストラクターを統合する方法はありますか?