C++ 11より前は、rvalue参照が存在せず、非const lvalue参照がrvaluesにバインドできなかったため、rvaluesにバインドできるconst lvalue参照のみでした。なぜ、非const左辺値参照が右辺値にバインドできなかったのかという理由は、それが危険であるということだった。それで、彼らはデータを移動することを可能にした値の参照を作成しました...しかし、rvalueにバインドされたrvalue参照は、rvaluesにバインドされた非const lvalue参照よりも安全であると考えられます。rvalue参照がlvalue参照よりも安全と考えられるのはなぜですか?
答えて
左辺値参照より右値参照の利点は、右辺値参照ではを知りますは、参照されるオブジェクトが右辺値であることです。したがって、あなたは他のデータを傷つけることなくそれを操作することが許されていることを知っています。
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
}
};
パフォーマンス上の利点は、左辺値参照は右辺値参照を許可された場合でも、最初に達成することができない、考えてみましょう。
ああ、「安全」のためにすべてですか?実際、それらはrvalue参照と同じ非左辺参照に同じ機能を追加することができますが、これは安全ではないので非const左辺参照のこの使用を禁じますか?そうであれば、非const左辺値参照が右辺値にバインドされ、ユーザーが正しくそれを使用する責任を持つことができるようにすることはできませんでしたか?それでは、別の参照型(rvalue references)を作成する必要はありませんか? –
正しく使用することではありません。 r値参照が参照されるオブジェクトの他の何らかの破壊的な操作を行うことを可能にすることによって、時にはパフォーマンス上の利点が達成されることがある。私はこれを反映するために私の返信を編集します。 – oz1cz
うんうん。しかし、動く部分のように非const左辺値参照で同じことを達成できなかったのですか? –
- 1. LvalueからRvalueへの参照バインディング
- 2. rvalue参照引数は、rvalue参照パラメータのconst lvalue参照よりも好きなのはなぜですか?ここ
- 3. なぜstd :: forwardはlvalueとrvalueをrvalue参照に変換しますか?
- 4. なぜ参照変数型はポインタよりも安全ですか?
- 5. 参照はいつRvalue参照ですか?
- 6. mongocxxカーソルとrvalue参照
- 7. 安全:: shared_ptrの参照
- 8. rvalue参照またはlvalue参照のいずれかをとる関数を宣言する適切な方法は何ですか?
- 9. オーバーロード解決時にconst左辺参照がconst rvalue参照よりも優先される理由
- 10. rvalue参照修飾子はrvalue参照を返す必要がありますか?
- 11. C++ Lvalue参照を受け取る関数へのRvalue参照の受け渡し
- 12. 安全なディクショナリ参照を返す
- 13. テーブルの行IDを参照する最も安全な方法
- 14. なぜstd :: moveはrvalue参照を引数として取るのですか?
- 15. なぜC++はデフォルトでrvalue参照を構築するのですか?
- 16. C++ Rvalue参照と移動セマンティクス
- 17. 参照リストから完全に参照を削除する
- 18. rvalueの参照とconstの左辺の参照との間の混乱
- 19. rvalue参照でより効率的に戻っていますか?例えば
- 20. *これを参考にしても安全ですか?
- 21. rvalueリファレンスまたは転送参照?
- 22. Latex目次に参考文献と参照が表示されるのはなぜですか?
- 23. Firebaseデータベース:照会されたdatasnapshotのキー/参照がその親を参照するのはなぜですか?
- 24. このrvalueが参照で指定されているlvalueに昇格されないのはなぜですか?
- 25. ASP.NET MVCのMetadataTypeの自己参照は安全ですか?
- 26. 安全なC#ではないC++、ポインタ/参照
- 27. 安全でない直接オブジェクト参照と検索エンジン
- 28. C++では、変数にrvalue型の参照があると言っても意味がありますか?
- 29. rvalue参照にリテラル定数を代入するとどうなりますか?
- 30. なぜconst参照は初期化できますが、rvalueから非const参照は初期化できませんか?
あなたは 'std :: move()'の推論について話していますか? – user0042
右辺値参照と同様に、右辺値参照はその参照先の有効期間を延長します。非const左辺値参照はこのプロパティを示しません。 –