、それは移動コンストラクタ署名
Type::Type(const Type&& other);
ムーブコンストラクタとしてconst
右辺値を可能にする方法可動物体は、const
ことができますか?これが技術的に許可されたとしても、そのような宣言が有用な場合がありますか?
、それは移動コンストラクタ署名
Type::Type(const Type&& other);
ムーブコンストラクタとしてconst
右辺値を可能にする方法可動物体は、const
ことができますか?これが技術的に許可されたとしても、そのような宣言が有用な場合がありますか?
可動オブジェクトはどのようにして
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を参照してください。
この機能の背景に関するいくつかの背景。
Rvalue references - From Bjarne Stroustrup's Blog
A Proposal to Add Move Semantics Support to the C++ Language
興味深い質問。私はStroustrupによるこの質問の説明をどこかで読みましたが、それを見つけることはできませんでした。上記がその代わりに役立つことを願っています。
単純な答え:いいえ、それは移動意味論の目的全体を敗北させるので、ありません。 '&&'は必ずしも "可動"とは限りません。それはちょうど "rvalue参照"と言う。 * MoveConstructible *は、移動元がない場合はコピーに失敗します。したがって、 'T const &&'移動が単にコピーするかもしれませんが、ええと言うことができます。 – Xeo
まあ、 'Type'は' mutable'変数を宣言し、 'mutable'変数は' const'移動コンストラクタによって変更できます。だから、 'const'移動コンストラクタはオブジェクトの浅いコピーを(コピーコンストラクタは深いコピーを行うかもしれませんが)行うことができ、' dead'などと呼ばれる 'mutable'ブールフラグを設定します。オブジェクト。そして、 'Type'(最も重要なのはデストラクタ)の関数がそのフラグをチェックします。これはナンセンスですか? –