2012-12-28 14 views
8

、それは移動コンストラクタ署名

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

ムーブコンストラクタとしてconst右辺値を可能にする方法可動物体は、constことができますか?これが技術的に許可されたとしても、そのような宣言が有用な場合がありますか?

+4

単純な答え:いいえ、それは移動意味論の目的全体を敗北させるので、ありません。 '&&'は必ずしも "可動"とは限りません。それはちょうど "rvalue参照"と言う。 * MoveConstructible *は、移動元がない場合はコピーに失敗します。したがって、 'T const &&'移動が単にコピーするかもしれませんが、ええと言うことができます。 – Xeo

+0

まあ、 'Type'は' mutable'変数を宣言し、 'mutable'変数は' const'移動コンストラクタによって変更できます。だから、 'const'移動コンストラクタはオブジェクトの浅いコピーを(コピーコンストラクタは深いコピーを行うかもしれませんが)行うことができ、' dead'などと呼ばれる 'mutable'ブールフラグを設定します。オブジェクト。そして、 'Type'(最も重要なのはデストラクタ)の関数がそのフラグをチェックします。これはナンセンスですか? –

答えて

9

可動オブジェクトはどのようにしてconstになりますか?

これはできませんが、言語では言いません。言語は、そのシグネチャを持つコンストラクタは "移動コンストラクタ"ですが、引数が移動されることを意味するものではなく、単にコンストラクタが "移動コンストラクタ"の要件を満たしていることを意味します。移動コンストラクタは何も移動する必要はなく、引数がconstの場合は移動できません。

このような宣言が役立つ場合がありますか?

ありますが、あまり頻繁ではありません。これは、const一時関数が引数として渡されたときに、別のコンストラクタが過負荷解決によって選択されないようにしたい場合に便利です。このコードで

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右辺値を取って別の過負荷、およびいずれかのデリゲート提供することができます:

Type(const Type&& t) : Type(t) { } 

をそれとも、コードがコンパイル予防としてそれを定義したい場合は、削除:

Type(const Type&& t) = delete; 

const rvalue参照を使用する標準の例については、https://stackoverflow.com/a/4940642/981959を参照してください。

関連する問題