这是问题Is there a sequence point between return and expression in return statement?的跟进。回答者没有回复我的评论,我也听不懂他的回答,也不知道该如何打扰。因此,我提出了这个问题,为此我由衷的歉意。

考虑下面的代码:

#include <iostream>
using namespace std;

struct foo{const char* bar ; foo(): bar("This is foo"){} };

foo returnByValue(){ return foo(); }
const foo& returnByConstRef() { return returnByValue();  } // *

int main() {
std::cout<< returnByConstRef().bar  <<std::endl; // is life of temp is extended in while this expression?
return 0;
}

我的理解是returnByValue()表达式(在returnByConstRef()内部)是临时对象foo()的副本(使用copy ctor)。现在returnByConstRef(),它是对returnByValue()(代码中原始temp()对象的副本)返回的临时对象的const引用,现在当我调用returnByConstRef().bar时,为什么它未定义行为?

我的想法哪里错了? ,RVO会这样做吗?

最佳答案

这不是由于RVO引起的,该标准指定绑定(bind)到返回值的临时对象的生存期不会延长:



例如:

const foo& returnByConstRef()
{
    return returnByValue();
}
returnByValue()是一个临时对象,绑定(bind)到返回值,就像这样:
const foo& returnByConstRef()
{
    const foo& _temporary_object = returnByValue();
    return _temporary_object;
    //object referenced by _temporary_object is destroyed
}

这些临时人员的寿命没有延长;它们在函数退出时被销毁。也许它将帮助您这样思考:
function returnByConstRef
    call returnByValue, put value on the stack
    put pointer to value in return register
    clear up stack, invalidating pointer to the value

关于c++ - 常量引用不会因为RVO而延长温度生命周期?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32738281/

10-13 08:23