2016-10-17 15 views
0

fooが有効であることが保証されているかどうか、つまり関数の戻り値をconst参照として格納することが許可されているかどうか混乱していますか?関数の戻り値への参照

戻り値がスタックフレームに格納されているため、値が返された直後に無効になる可能性があるため、私は尋ねています。

Foo getFoo() { 
    return Foo(); 
} 

void bar() { 
    const auto& foo = getFoo(); 

    // more function calls... 

    // is foo guaranteed to be valid? 
} 
+1

はい、有効です。 –

+0

私は質問の別の側面を強調したいと思っていました。重複しているとマークされたハブ・サッターのリンクは、実際には記憶の観点には触れません。新しいスタックフレームが割り当てられたときに、参照されたオブジェクトが上書きされない理由は本当に興味があります。 – user695652

+0

私はそれが実装定義の機能だと思います。 –

答えて

1

それは有効なC++がある、しかしいくつかのコンパイラ(例えばVisual Studioの2015年には、私の知る限り)が正しくそれを実装していないことに注意してください。標準(N4140)によれば

12.2一時オブジェクト
....

一時が異なる点で破壊された二つのコンテキストがありますフルプレッションの終わり。最初のコンテキストは、配列の要素を初期化するためにデフォルトコンストラクタが呼び出されるときです。 コンストラクタに1つまたは複数のデフォルト引数がある場合、デフォルトの 引数に作成されたすべての一時的な破棄は、次の配列要素がある場合は、その前に配列されます。

第2のコンテキストは、参照が一時的なものにバインドされている場合です。 参照が 参照がに結合されたサブオブジェクトの完全なオブジェクトを除く参照の存続期間 を持続さまたは一時的な結合された一時:

を(いくつかの例外)