为了账号安全,请及时绑定邮箱和手机立即绑定

临时人员的一生

临时人员的一生

C++ C
沧海一幻觉 2019-07-20 14:33:06
临时人员的一生下面的代码工作正常,但为什么这是正确的代码?为什么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() );
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

$12.2/3-“临时对象被销毁,作为评估完整表达式(1.9)的最后一步,这个表达式(在词汇上)包含创建它们的点,即使该评估以抛出异常结束也是如此。”

foo()返回的临时表达式的生存期将一直延长到创建完整表达式的末尾,即函数调用‘bar’的末尾。

编辑2:

$1.9/12-“一个完整表达式不是另一个表达式的子表达式,如果一个语言结构被定义为产生一个函数的隐式调用,那么就这个定义而言,语言结构的使用被认为是一个表达式。”


查看完整回答
反对 回复 2019-07-20
?
阿晨1998

TA贡献2037条经验 获得超6个赞

当在词汇上包含其计算结果所创建的临时对象的rvalue的完整表达式被完全计算时,临时对象将被销毁。让我用ASCII的艺术来演示:


____________________   full-expression ranges from 'b' to last ')'

bar( foo().c_str() );

     ^^^^^          ^

       |            |

     birth       funeral


查看完整回答
反对 回复 2019-07-20
  • 2 回答
  • 0 关注
  • 398 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信