この一時的な参照は十分に長く存続しますか?

template 
T const & foo(T const & dflt) 
  { return /* ... */ ? /* ... */ : dflt; }

にt x = foo(5);

一時参照はxに代入されるまで「生き残る」か?

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

The code に question has some legitimate uses for relyにg on const references here, i.e. I would need two separate functions

T const & foo_cr(T  const & dflt);
T const & foo_v(T dflt);

which I want to avoid (just relyにg on different signatures wiht the same name seems a bit risky to me.)

16
この文脈では、 ... は「質問には関係のないコードです。コメントに変更しました。
追加された 著者 peterchen,
とは何ですか? ...:dflt; という意味ですか? 0_o
追加された 著者 Mr.Anubis,

1 答え

一時参照がxに割り当てられるまで、参照は「生き残る」か?

一般的には、はい。 foo dflt を返した場合、その参照(一時的な5への参照)は、フル・エクスプレッションが作成されるまで、つまり初期化後まで有効です。

C ++ 03、12.2/3:

実装がクラスの一時オブジェクトを導入するとき   非自明のコンストラクタ(12.1)を持つ場合、それは   一時オブジェクトに対してコンストラクタが呼び出されます。同様に、   デストラクタは一時的に呼び出されなければならない   デストラクタ(12.4)。一時的なオブジェクトは、最後のステップとして破棄されます。   完全表現(1.9)を評価する(字句的に)   それらが作成されたポイント。これは、その評価   例外をスローすることで終了します。

詳細は12.2/4と12.2/5、特にこのルールの例外を参照してください。

あなたが残した ... を返すときに何が起こるかわかりませんが、これについて質問していないと思います。

14
追加された
迅速な答えをありがとう!はい、ケースは安全です - 私はそれを除外しました(追加パラメータとして参照渡しされたコレクションの要素への参照)
追加された 著者 peterchen,
現在、 "x"へのストアが完全な式の一部であることは指定されていません。ただし、 llvm.org/bugs/show_bug.cgi?id=9783 を参照してください。委員会と(うまくいけば)ユーザーの両方が強く求めている。しかしそれとは独立して、 foo (左辺値と右辺値)によって返される参照の読み込みは完全な式の一部であるという仕様によって既に指定されています。 1.9p10とその後の例を参照してください。
追加された 著者 Johannes Schaub - litb,