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

临时人员的一生

临时人员的一生

C++
ITMISS 2019-08-03 07:03:15
临时人员的一生下面的代码工作正常,但为什么这是正确的代码?为什么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 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

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

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

编辑2:

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




查看完整回答
反对 回复 2019-08-04
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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


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

bar( foo().c_str() );

     ^^^^^          ^

       |            |

     birth       funeral



查看完整回答
反对 回复 2019-08-04
  • 2 回答
  • 0 关注
  • 286 浏览

添加回答

举报

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