7

この参照からconst、移動コンストラクターとして右辺値を許可します

Type::Type( const Type&& other );

可動オブジェクトはどのようにできますconstか? これが技術的に許可されていたとしても、そのような宣言が役立つ場合はありますか?

4

2 に答える 2

8

可動物体はどのようになり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を参照してください。

于 2012-12-28T15:06:07.667 に答える
0

この機能の意図に関するいくつかの背景。

右辺値の参照-BjarneStroustrupのブログから

移動セマンティクスサポートをC++言語に追加する提案

興味深い質問です。どこかで、ストロヴルプによるこの質問の説明を読みましたが、それを見つけることができないようです。上記が代わりに役立つことを願っています。

于 2012-12-29T01:22:59.907 に答える