我刚刚阅读了 RVO(返回值优化)和 NRVO(命名返回值优化)。下面是两个例子
//Example of RVO
Bar Foo()
{
return Bar();
}
//Example of NVRO
Bar Foo()
{
Bar bar;
return bar;
}
这是有道理的,一个不错的编译器优化。但是,我从 Stanley Lippman 的“C++ 入门”中读到“从不返回指向本地对象的引用或指针”(第 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 优化,而不是由于调用堆栈展开而导致未定义的行为?