私はとして与えられたコピーと移動コンストラクタの推奨署名を見てきました:コピーコンストラクタはconst参照を取得し、移動コンストラクタは非const右辺値参照を取る移動コンストラクタはconstまたは非const rvalue参照を取るべきですか?いくつかの場所で
struct T
{
T();
T(const T& other);
T(T&& other);
};
。例えば、以下の場合のように
限り私も見ることができるように、これは関数からのconstオブジェクトを返すときに、私は移動セマンティクスを利用して防ぐ、:
T generate_t()
{
const T t;
return t;
}
テストこのVC11ベータ版、T
'はコピーコンストラクタが呼び出され、移動コンストラクタは呼び出されません。 return std::move(t);
を使用しても、コピーコンストラクタは引き続き呼び出されます。
私はt
がconstのであるので、T&&
に結合してはならないので、これは、理にかなっているかを見ることができます。 const T&&
を移動コンストラクタのシグネチャで使用すると意味がありますが、other
がconstなので、メンバーをゼロにする必要がある場合、メンバをヌルにすることはできません。すべてのメンバスカラーであるか、正しいシグニチャーを持つコンストラクターを移動します。
t
は、コンストラクタが一般的な場合に呼び出されて最初に非constになっていることを確認する唯一の方法ですが、それを行うのは嫌いです。 T
の顧客は、パフォーマンスを向上させるためにそのフォームに反対しなければならないことを知ることを期待していません。
私の質問は二重であると思います。最初に、移動コンストラクタはconstまたは非const rvalue参照を取るべきですか?そして2番目:私はこの推論のラインで正しいのですか?私はconstのものを返すのを止めるべきですか?
まあ、私はconstの一時変数を返すユースケースはやや小さいと思います。あなたがそれを前もって宣言すれば、あなたはそれを返す前にいくつかのことをしたいからです。そうでなければ、とにかく単純な 'return T()'が行います。私はまだ特定のユースケースを見ることができますが、私はそれらがまれであると思います。そしてもちろん、あなたが資源を盗むことができない値の参照は、左辺の参照と比較して実際には価値がありません。しかし、質問を中断する。 –
ところで、このコードはNRVOに適格ではありませんか?したがって、何が起こるべきかは、 'const'オブジェクト' t'が非const戻り値と同じ場所に構築されるということです。次に、必要であれば非const戻り値*を呼び出し元が非const移動コンストラクタ(または移動代入演算子)を介して移動できるようにします。しかし、構築の場合、コピー・エリジョンの資格があり、 'generate_t()'の呼び出しを使って初期化されているものに直接 't'を組み込むことができます。 VC11がこの最適化を妨げているのは何ですか? –
_consting物事は良いですform_あなたを修正したい場合はありません。それらから移動することによって。 –