2017-07-07 18 views
0

C++ 11より前は、rvalue参照が存在せず、非const lvalue参照がrvaluesにバインドできなかったため、rvaluesにバインドできるconst lvalue参照のみでした。なぜ、非const左辺値参照が右辺値にバインドできなかったのかという理由は、それが危険であるということだった。それで、彼らはデータを移動することを可能にした値の参照を作成しました...しかし、rvalueにバインドされたrvalue参照は、rvaluesにバインドされた非const lvalue参照よりも安全であると考えられます。rvalue参照がlvalue参照よりも安全と考えられるのはなぜですか?

+0

あなたは 'std :: move()'の推論について話していますか? – user0042

+0

右辺値参照と同様に、右辺値参照はその参照先の有効期間を延長します。非const左辺値参照はこのプロパティを示しません。 –

答えて

1

左辺値参照より右値参照の利点は、右辺値参照ではを知りますは、参照されるオブジェクトが右辺値であることです。したがって、あなたは他のデータを傷つけることなくそれを操作することが許されていることを知っています。

const非左辺値参照が右辺値を参照することが許可されている場合、参照されたオブジェクトが一時的なものかどうかは決して分かりません。たとえばあなたは番目のバージョンで取得することができ、これらの2つのコンストラクタ

class A { 
public: 
    A(A& src) // Copy constructor 
    { 
     // Create a copy of src, but be sure to leave src intact 
    } 

    A(A&& src) // Move constructor 
    { 
     // Create a copy of src. If necessary, you can steal some 
     // of src's resources (dynamic memory, open files). It 
     // won't miss it 
    } 
}; 

パフォーマンス上の利点は、左辺値参照は右辺値参照を許可された場合でも、最初に達成することができない、考えてみましょう。

+0

ああ、「安全」のためにすべてですか?実際、それらはrvalue参照と同じ非左辺​​参照に同じ機能を追加することができますが、これは安全ではないので非const左辺参照のこの使用を禁じますか?そうであれば、非const左辺値参照が右辺値にバインドされ、ユーザーが正しくそれを使用する責任を持つことができるようにすることはできませんでしたか?それでは、別の参照型(rvalue references)を作成する必要はありませんか? –

+0

正しく使用することではありません。 r値参照が参照されるオブジェクトの他の何らかの破壊的な操作を行うことを可能にすることによって、時にはパフォーマンス上の利点が達成されることがある。私はこれを反映するために私の返信を編集します。 – oz1cz

+0

うんうん。しかし、動く部分のように非const左辺値参照で同じことを達成できなかったのですか? –

関連する問題