首页 > 后端开发 > C++ > 为什么 C 临时字符串的 `c_str()` 在函数调用后仍然有效?

为什么 C 临时字符串的 `c_str()` 在函数调用后仍然有效?

Mary-Kate Olsen
发布: 2024-12-16 18:57:21
原创
189 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板