69

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

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

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

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

なんで?から返される文字列fooは一時的なものであり、valは存続期間が終了したオブジェクトを指すことができると思いました。C ++標準はこれを許可し、返されたオブジェクトの寿命を延ばしますか?

4

1 に答える 1

84

これはC++の機能です。コードは有効であり、見た目どおりに機能します。

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

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

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

于 2012-07-19T12:03:38.680 に答える