web-dev-qa-db-ja.com

一時オブジェクトを返し、const参照にバインドする

可能性のある複製:
const参照は一時的な寿命を延ばしますか?

私のコンパイラは、const参照への一時的な割り当てについて文句を言いません。

string foo() {
  return string("123");
};

int main() {
  const string& val = foo();
  printf("%s\n", val.c_str());
  return 0;
}

どうして? fooから返される文字列は一時的なもので、valはライフタイムが終了したオブジェクトを指すことができると考えました。 C++標準はこれを許可し、返されるオブジェクトの寿命を延長しますか?

60
gruszczy

これはC++の機能です。コードは有効で、表示されているとおりに動作します。

通常、一時オブジェクトは、それが現れる完全な式の最後までしか続きません。ただし、C++は、一時オブジェクトを参照にバインドしてスタックをconstにすることにより、一時オブジェクトの有効期間を参照自体の有効期間に延長することを意図的に指定し、そうしないと一般的なダングリング参照エラーを回避します。上記の例では、foo()によって返される一時は、閉じ中括弧まで存続します。

PS:これは、スタックベースの参照にのみ適用されます。オブジェクトのメンバーである参照には機能しません。

全文: GotW#88:ハーブサッターによる「最も重要なconst」の候補

69
Sergey K.