ホームページ > バックエンド開発 > C++ > C の一時文字列の `c_str()` が関数呼び出し後も有効なままなのはなぜですか?

C の一時文字列の `c_str()` が関数呼び出し後も有効なままなのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-16 18:57:21
オリジナル
180 人が閲覧しました

Why Does a C   Temporary String's `c_str()` Remain Valid After the Function Call?

一時オブジェクトの有効期間を再考

提供されたコード スニペットは、 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート