次のクラスを検討してください。
#include <iostream>
#include <string>
class A
{
std::string test;
public:
A (std::string t) : test(std::move(t)) {}
A (const A & other) { *this = other; }
A (A && other) { *this = std::move(other); }
A & operator = (const A & other)
{
std::cerr<<"copying A"<<std::endl;
test = other.test;
return *this;
}
A & operator = (A && other)
{
std::cerr<<"move A"<<std::endl;
test = other.test;
return *this;
}
};
class B
{
A a;
public:
B (A && a) : a(std::move(a)) {}
B (A const & a) : a(a) {}
};
を作成するとき、右辺値の場合は 1 つの移動、左辺値の場合は 1 つのコピーB
の最適な転送パスが常にあります。A
1 つのコンストラクターで同じ結果を達成することは可能ですか? この場合は大きな問題ではありませんが、複数のパラメーターはどうでしょうか。パラメータリスト内の左辺値と右辺値のすべての可能な出現の組み合わせが必要になります。
これはコンストラクターに限らず、関数パラメーター (セッターなど) にも当てはまります。
注: この質問は厳密にはclass B
; class A
コピー/移動呼び出しがどのように実行されるかを視覚化するためだけに存在します。