91
A
答えて
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();
関連する問題
- 1. C#データ収集vデータベース参照 - より効率的ですか?
- 2. Javaの戻り参照値(または参照によって)
- 3. C++ 0xの戻り値はrvalue参照で渡されますか?
- 4. 参照はいつRvalue参照ですか?
- 5. rvalue参照がlvalue参照よりも安全と考えられるのはなぜですか?
- 6. rvalue参照修飾子はrvalue参照を返す必要がありますか?
- 7. Pandasはメモリに効率的に参加していますか?
- 8. rvalue参照引数は、rvalue参照パラメータのconst lvalue参照よりも好きなのはなぜですか?ここ
- 9. mongocxxカーソルとrvalue参照
- 10. なぜstd :: forwardはlvalueとrvalueをrvalue参照に変換しますか?
- 11. より効率的なスクリプトですか?
- 12. より効率的なソリューションですか?
- 13. C#では、参照型が値型より効率的なのはいつですか?
- 14. このように文字列を効率的に切り替える方法はありますか?より効率的なものはありますか?
- 15. rvalueリファレンスまたは転送参照?
- 16. LvalueからRvalueへの参照バインディング
- 17. rvalue参照による返品はどのように機能しますか?
- 18. C++では、変数にrvalue型の参照があると言っても意味がありますか?
- 19. ActiveRecordのは:参照キーは、例えば
- 20. rvalue参照での一時的な存続期間の延長
- 21. CPP戻り参照
- 22. C++参照戻り
- 23. Apache Sparkでの効率的なデータフレーム参照
- 24. Visual Studio 2012 - 循環参照を効率的に検索
- 25. rvalue参照にリテラル定数を代入するとどうなりますか?
- 26. 各ループでより効率的に
- 27. より効率的にJavaで書く
- 28. Datatableよりも効率的
- 29. より効率的なパンダコード
- 30. より効率的なコード
は自動的に去っていきましたr値参照。それが私に噛み砕かれる前に、私はそれをまっすぐにしました。 Stack Smashingバグが吸う。 –
:)本当に、左辺値の参照は右辺値のように "ちょうど参照"です。彼らは何もコピーも保存もしません。 –
そしてコンストラクタを削除しなくても、自動的に安全にrvalue-refを返すことができるコンパイラが知っています。例えば、私の実験によると、 'return x;'は 'return std :: move(x)'と同じです。 (ここで 'x 'はローカル変数です(つまり、私が作ったこの点は、一時的な返り値についての元の質問には直接適用されません))。 –