2012-02-06 12 views
16

それをxに代入されるまでの一時的なへの参照は、「生き残る」していますか?この一時参照は十分に長く存続しますか?</p> <pre><code>template <typename T> T const & foo(T const & dflt) { return /* ... */ ? /* ... */ : dflt; } int x = foo(5); </code></pre> <p>で

(私はそれがfoo()呼び出しの期間を存続知っているが、割り当てが、私は躊躇します)

問題のコードはつまり、私は別の2が必要になり、ここでのconst参照に頼るのためのいくつかの合法的な用途があります機能

私は避けたい
T const & foo_cr(T const & dflt); 
T const & foo_v(T dflt); 

(ちょうど同じ名前wiht異なるシグネチャに頼るが、私には危険なビットだ。)

+0

「...は何ですか? ...:dflt; 'それはどういう意味ですか? 0_o –

+1

このコンテキストでは、「...」は「質問には関係のないコードです。私はコメントに変更しました。おそらくそれはもっと明白です。 – peterchen

答えて

14

が一時的に参照していuが「生き残ります」それはxに割り当てられていますか?

通常、はいです。 foodfltを返す場合、その参照(一時的な5への)は、それが作成された完全な式の最後まで有効です。つまり、初期化後までです。

C++ 03、12.2/3:

実装は が非自明なコンストラクタ(12.1)を有し、そのクラスの一時オブジェクトを紹介するとき、それは コンストラクタが呼び出されることを保証しなければなりません一時オブジェクトのために。同様に、 デストラクタは、些細ではない デストラクタ(12.4)で一時的に呼び出されます。 の最後のステップとして一時オブジェクトが破棄されます。完全表現(1.9)は、それらが作成された ポイントが(字句的に)含まれていると評価されます。たとえその評価 が例外をスローすることで終了しても、これは当てはまります。

さらに、12.2/4と12.2/5、特にこのルールの例外があります。

あなたが放した...を返すと何が起こるかわかりませんが、あなたはこれについて尋ねていないと思います。

+7

現在、「x」へのストアがフルしかし、それは独立していますが、それは独立しています。 * 'foo'によって返された参照の*(左辺値)は完全な式の一部です1.9p10とその後ろの例を参照 –

+0

素早く答えてくれてありがとう!それを除外します(追加パラメータとして参照渡しされたコレクションの要素への参照) – peterchen

関連する問題

 関連する問題