初期化子が短命のrvalue参照を返す関数呼び出しである場合にのみ問題があります。少ない単語とコードで:
// Fine; lifetime extension applies!
auto&& ref = 42;
auto id = [](int&& i) -> int&& { return std::move(i); };
auto&& uhoh = id(42);
// uhoh is now a stale reference; can't touch it!
対照的に、auto uhoh = id(42);
は正常に機能していました。
std::make_tuple
は値を返しますが、r値の参照ではないため、問題はありません。
実際の危険は、rvalue参照パラメータを持つこれらの関数と関数テンプレートから来ており、生存時間がそれらに依存するいくつかのサブオブジェクトのいずれかにrvalue参照を返していると私は考えています。 (言われているように、auto&& ref = std::move(42);
のような単純なものが問題を呈しています!)
状況は全く新しいC++ 11ではなく、以下を考慮してください:T const& ref = bar(T_factory());
。
参照は参考資料です。 –
について 'auto && var = func()'、http://stackoverflow.com/questions/13618506/is-it-possible-to-stdmove-objects-out-of-functions-c11/13618587#13618587 – billz
@billzリンクは、ローカル変数を参照として返す別のケースです。バグは、呼び出されていない関数の中にあります。 – balki