一時オブジェクトの有効期間を再考
提供されたコード スニペットは、 C における一時オブジェクトの興味深い動作を示しています。次の点を考慮してください:
std::string foo() { std::string out = something...; return out; } void bar(const char* ccp) { // Do something with the string... } bar(foo().c_str());
foo() によって返される一時オブジェクトの "c_str()" ポインタがまだ有効なのはなぜですか?という疑問が生じます。常識的には、bar() が呼び出される前に一時ファイルを破棄する必要があると思われるかもしれません。しかし、これは当てはまりません。
C 標準によれば、一時オブジェクトの存続期間は、それを作成した右辺値を字句的に含む完全な式の評価が完了するまで延長されます。これは、指定されたコードでは、foo() によって返された一時オブジェクトは、bar() の呼び出しが完了するまで生き続けることを意味します。
この概念を視覚化するには、次の点を考慮してください。
____________________ full-expression ranges from 'b' to last ')' bar(foo().c_str()); ^^^^^ ^ | | birth funeral
一時オブジェクトは、foo() が呼び出されたときに作成されます (「誕生」と表記されます)。これは、完全な式の評価中ずっと存続します。この場合、関数呼び出し bar(foo().c_str()) です。関数呼び出しが完了すると、一時オブジェクトは破棄されます (「葬儀」として示されます)。
以上がC の一時文字列の `c_str()` が関数呼び出し後も有効なままなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。