いくつかの場所で、次のように与えられたコピーおよび移動コンストラクターの推奨される署名を見てきました。
struct T
{
T();
T(const T& other);
T(T&& other);
};
ここで、copyコンストラクターはconst参照を取り、moveコンストラクターはnon-const右辺値参照を取ります。
しかし、私が見る限り、これにより、以下の場合のように、関数からconstオブジェクトを返すときにmoveセマンティクスを利用できなくなります。
T generate_t()
{
const T t;
return t;
}
これをVC11BetaでテストするとT
、moveコンストラクターではなく、のコピーコンストラクターが呼び出されます。return std::move(t);
コピーコンストラクターを使用しても、引き続き呼び出されます。
t
constなので、にバインドするべきではないので、これがどのように意味があるかがわかりますT&&
。移動コンストラクター署名での使用const T&&
は正常に機能し、理にかなっていますが、other
constであるため、メンバーをヌルアウトする必要がある場合はメンバーをヌルアウトできないという問題があります。これは、すべてのメンバーがスカラーである場合にのみ機能します。または、正しい署名を持つ移動コンストラクターがあります。
一般的なケースでmoveコンストラクターが呼び出されて、t
そもそも非定数になっていることを確認する唯一の方法のように見えますが、私はそれを行うのは好きではありません。T
パフォーマンスを向上させるために、そのフォームに反対する必要があることを知っているクライアント。
ですから、私の質問は2つあると思います。まず、moveコンストラクターはconstまたはnon-constの右辺値参照を取得する必要がありますか?そして第二に:私はこの推論の線に正しいですか?constであるものを返すのをやめるべきだと?