この参照からconst
、移動コンストラクターとして右辺値を許可します
Type::Type( const Type&& other );
可動オブジェクトはどのようにできますconst
か? これが技術的に許可されていたとしても、そのような宣言が役立つ場合はありますか?
この参照からconst
、移動コンストラクターとして右辺値を許可します
Type::Type( const Type&& other );
可動オブジェクトはどのようにできますconst
か? これが技術的に許可されていたとしても、そのような宣言が役立つ場合はありますか?
可動物体はどのようになり
const
ますか?
それはできませんが、それは言語が言っていることではありません。この言語では、その署名を持つコンストラクターは「moveコンストラクター」であると言われていますが、これは引数が移動されることを意味するのではなく、コンストラクターが「moveコンストラクター」の要件を満たしていることを意味します。何かを移動するために移動コンストラクターは必要ありません。引数がconst
そうである場合は移動できません。
そのような宣言が役立つ場合はありますか?
はい、しかしそれほど頻繁ではありません。consttemporaryが引数として渡されたときにオーバーロード解決によって別のコンストラクターが選択されないようにする場合に役立ちます。
struct Type
{
template<typename T>
Type(T&&); // accepts anything
Type(const Type&) = default;
Type(Type&&) = default;
};
typedef const Type CType;
CType func();
Type t( func() ); // calls Type(T&&)
このコードでは、から返される一時的なものはfunc()
、コピーまたは移動コンストラクターのパラメーターと正確に一致しないため、任意の型を受け入れるテンプレートコンストラクターを呼び出します。これを防ぐには、const rvalueを使用して別のオーバーロードを提供し、コピーコンストラクターに委任します。
Type(const Type&& t) : Type(t) { }
または、コードのコンパイルを防ぎたい場合は、削除済みとして定義します。
Type(const Type&& t) = delete;
const rvalue参照を使用する標準の例については、 https: //stackoverflow.com/a/4940642/981959を参照してください。
この機能の意図に関するいくつかの背景。
興味深い質問です。どこかで、ストロヴルプによるこの質問の説明を読みましたが、それを見つけることができないようです。上記が代わりに役立つことを願っています。