引数で作成されたオブジェクトが破棄されると、関数呼び出しの前または後?
たとえば、次のコードは安全ですか?
void f(const char*)
{ ... }
std::string g()
{ ... }
...
f(g().c_str());
それは常に私のために機能しますが、それが単に未定義の動作なのか、それとも実際に機能するはずなのかはわかりません。
g()
一時的なものです。一時的なものの寿命は、完全な式全体の評価の全時間に延長されます(あなたの場合、それはそうなるでしょうf(g().c_str())
)。したがってf()
、ポインタをどこかに格納しない限り、使用は安全です。
§12.2/ 4完全な表現の終わりとは異なる時点で一時的なものが破壊される2つのコンテキストがあります。最初のコンテキストは、オブジェクトを定義する宣言子の初期化子として式が表示される場合です。そのコンテキストでは、式の結果を保持する一時オブジェクトは、オブジェクトの初期化が完了するまで存続する必要があります。[...]
§12.2/ 5 2番目のコンテキストは、参照が一時的なものにバインドされている場合です。[...]
これらの2つのケースはどちらもあなたの例には当てはまりません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加