C++:RVO、NRVO和返回的本地对象

C++:RVO、NRVO和返回的本地对象,c++,rvo,nrvo,C++,Rvo,Nrvo,我刚刚读到关于RVO返回值优化和名为返回值优化的NRVO的内容。下面是两个例子 //Example of RVO Bar Foo() { return Bar(); } //Example of NVRO Bar Foo() { Bar bar; return bar; } 这很有意义,是一个很好的编译器优化。但是,我从Stanley Lippman的C++引物中看到,它从来没有返回一个引用或指针到本地对象CH 6.3.2,示例代码是 //disaster: this

我刚刚读到关于RVO返回值优化和名为返回值优化的NRVO的内容。下面是两个例子

//Example of RVO
Bar Foo()
{
    return Bar();
}

//Example of NVRO
Bar Foo()
{
    Bar bar;
    return bar;
}
这很有意义,是一个很好的编译器优化。但是,我从Stanley Lippman的C++引物中看到,它从来没有返回一个引用或指针到本地对象CH 6.3.2,示例代码是

//disaster: this function returns a reference to a local object
const string &manip()
{
    string ret;
    // transform ret in some way
    if (!ret.empty())
        return ret;  // WRONG: returning a reference to a local object!
    else
        return "Empty"; // WRONG: "Empty" is a local temporary string
}
我不明白,这个例子和RVO的例子有什么不同吗? 如果它们相同,我如何确保编译器将执行RVO优化,而不是由于调用堆栈展开而导致未定义的行为?

它们不同

Bar Foo();
按值返回,复制本地对象

const string &manip();
通过引用返回,将返回本地对象本身,同时函数返回的引用无效。

它们是不同的

Bar Foo();
按值返回,复制本地对象

const string &manip();

通过引用返回,返回本地对象本身,同时函数返回时引用无效。

注意,RVO和NRVO的标准术语是@MattMcNabb是,我现在可以看到它。谢谢注意,RVO和NRVO的标准术语是@mattmcnab是的,我现在可以看到。谢谢