37

次のコードは正常に機能しますが、なぜこの正しいコードなのですか?foo()によって返される一時の「c_str()」ポインタが有効なのはなぜですか?この一時的なものは、bar()に入るとすでに破棄されていると思いましたが、このようには見えません。だから、今私はfoo()によって返された一時的なものがbar()の呼び出しの後に破壊されると仮定します-これは正しいですか?なぜ?

std::string foo() {
  std::string out = something...;
  return out;
}

void bar( const char* ccp ) {
  // do something with the string..
}

bar( foo().c_str() );
4

2 に答える 2

67

一時オブジェクトは、その評価によって一時オブジェクトが完全に評価された右辺値を字句的に含む完全式が作成されたときに破棄されます。アスキーアートでデモンストレーションしましょう:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral
于 2010-11-18T11:21:55.233 に答える
50

$ 12.2 / 3-「一時オブジェクトは、(字句的に)作成されたポイントを含む完全式(1.9)を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。」

foo()によって返される一時的なものの存続期間は、それが作成される完全な式の終わりまで、つまり関数呼び出し'bar'の終わりまで延長されます。

編集2:

$ 1.9 / 12-「完全な式は、別の式の部分式ではない式です。関数の暗黙的な呼び出しを生成するように言語構造が定義されている場合、言語構造の使用は、この定義の目的。」

于 2010-11-18T11:20:17.487 に答える