11

は私がなぜC++はデフォルトでrvalue参照を構築するのですか?

void doWork(Widget && param) // param is an LVALUE of RRef type 
{ 
    Widget store = std::move(param); 
} 

は、なぜ私はstd::move()と右辺値に戻すparamをキャストする必要がありますか、次の機能を持っていると言いますか? paramの型は、関数のシグネチャでrvalue参照として宣言されているので、rvalueであることは明らかではありませんか?この原理だけで、移動コンストラクタをここで自動的に呼び出すべきではありませんか?

なぜこれはデフォルトでは起こりませんか?あなたのデザインの

答えて

22

現在の設計と
void doWork(Widget && param) 
{ 
    Widget store1 = param;  // automatically move param 
    Widget store2 = param;  // boom 

    Widget store_last = param; // boom  
} 

void doWork(Widget && param) 
{ 
    Widget store1 = param;    // ok, copy 
    Widget store2 = param;    // ok, copy 

    Widget store_last = std::move(param); // ok, param is moved at its last use 
} 

だからここに道徳的あなたは右辺値参照を持っている場合でも、あなたが使用できることを意味し、それの名前を持っているということですそれは複数回です。したがって、後で使用するために必要な場合があるため、自動的に移動することはできません。

+0

わかりました。それは意味をなさない!私は同意する、コピーデザインは常に暗黙の移動よりも安全です! – barney

+0

@バーニー単純な例があなたを「ええ、私は理解します!うれしい私は1つを提供することができます。 – bolov

+0

IDは実際にはこれを行う実際のコードを見つけるのには本当に苦労しますが、コンパイラが検出できず、エラーとして扱うことはできません。相対的なトレードオフに関する提案について議論があったのでしょうか、それともはるかに起こりそうな状況がありますか? –

関連する問題