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. Javaの戻り参照値(または参照によって)
- 2. C#データ収集vデータベース参照 - より効率的ですか?
- 3. C++ 0xの戻り値はrvalue参照で渡されますか?
- 4. LvalueからRvalueへの参照バインディング
- 5. rvalue参照による返品はどのように機能しますか?
- 6. C#では、参照型が値型より効率的なのはいつですか?
- 7. rvalue参照での一時的な存続期間の延長
- 8. CPP戻り参照
- 9. Visual Studio 2012 - 循環参照を効率的に検索
- 10. rvalue参照にリテラル定数を代入するとどうなりますか?
- 11. 各ループでより効率的に
- 12. より効率的なjquery
- 13. Datatableよりも効率的
- 14. より効率的なjQuery
- 15. より効率的なルート
- 16. C++ Rvalue参照と移動セマンティクス
- 17. 静的メソッドからの参照をスレッドセーフで戻していますか?
- 18. インラインアセンブリを使用してC配列を効率的に参照する
- 19. 「参照」の使用方法にはあいまいさがありますか?例えば
- 20. バルクJavaScriptをより効率的に置き換える
- 21. 関数の先頭に「早く戻る」のが良いスタイル(またはより効率的)ですか?
- 22. DataFrame列の効率的な値の参照
- 23. 参照するフィールドがオートインクリメントしているときに、外部キー制約を効率的に模倣するにはどうすればよいですか?
- 24. 子オブジェクトから親に戻って参照する
- 25. 名前付きrvalue参照の型は何ですか?
- 26. PHP - 例えばファンクションの戻り値を動的
- 27. 現在のタイプを参照している複数のモデルを効率的に取得するにはどうすればよいですか?
- 28. より効率的な方法にプリロードイメージ
- 29. クエリをより効率的に
- 30. 値によって戻り値がconst参照に割り当てられました
は自動的に去っていきましたr値参照。それが私に噛み砕かれる前に、私はそれをまっすぐにしました。 Stack Smashingバグが吸う。 –
:)本当に、左辺値の参照は右辺値のように "ちょうど参照"です。彼らは何もコピーも保存もしません。 –
そしてコンストラクタを削除しなくても、自動的に安全にrvalue-refを返すことができるコンパイラが知っています。例えば、私の実験によると、 'return x;'は 'return std :: move(x)'と同じです。 (ここで 'x 'はローカル変数です(つまり、私が作ったこの点は、一時的な返り値についての元の質問には直接適用されません))。 –