2009-07-12 11 views

答えて

165
Beta_ab&& 
Beta::toAB() const { 
    return move(Beta_ab(1, 1)); 
} 

これは単なる左辺値基準ケースと同様に、ダングリング参照を返します。関数が返った後、一時オブジェクトは破棄されます。あなたは今、次の

Beta_ab 
Beta::toAB() const { 
    return Beta_ab(1, 1); 
} 

のように、値によってBeta_abを返す必要があり、それが適切に関数の戻り値に一時的Beta_abオブジェクトを移動しています。コンパイラができる場合は、RVO(戻り値の最適化)を使用して移動を完全に回避します。さて、あなたは以下の

Beta_ab ab = others.toAB(); 

を行うことができますし、それはabに一時的に構築移動、または移動を行って省略するか、完全にコピーするRVOを行います。問題を説明するBoostCon09 Rvalue References 101を読んで、(N)RVOがこれとやりとりすることをお勧めします。


rvalue参照を返す場合は、他の場合には良い考えです。あなたがしばしば一時的に呼び出すgetAB()関数を持っているとします。 rvalueの一時的な値のconst左辺参照を返すことは最適ではありません。あなたはab自動ローカルでも一時的な右辺値でもないので、この場合はmoveは、オプションではないことを、この

struct Beta { 
    Beta_ab ab; 
    Beta_ab const& getAB() const& { return ab; } 
    Beta_ab && getAB() && { return move(ab); } 
}; 

ノートのようにそれを実装することができます。戻り値の型だったときに今、私は常にダングリング参照問題を想定していたコピーの代わりにREF-修飾子&&次の動きを作り、第二の機能は、右辺値一時に呼び出されると言う、

Beta_ab ab = Beta().getAB(); 
+32

は自動的に去っていきましたr値参照。それが私に噛み砕かれる前に、私はそれをまっすぐにしました。 Stack Smashingバグが吸う。 –

+17

:)本当に、左辺値の参照は右辺値のように "ちょうど参照"です。彼らは何もコピーも保存もしません。 –

+0

そしてコンストラクタを削除しなくても、自動的に安全にrvalue-refを返すことができるコンパイラが知っています。例えば、私の実験によると、 'return x;'は 'return std :: move(x)'と同じです。 (ここで 'x 'はローカル変数です(つまり、私が作ったこの点は、一時的な返り値についての元の質問には直接適用されません))。 –

関連する問題