我刚刚读到了关于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优化,而不是由于调用堆栈展开而导致未定义的行为?
答案 0 :(得分:3)
他们是不同的。
Bar Foo();
按值返回,复制本地对象。
const string &manip();
通过引用返回,返回本地对象本身,并且在函数返回的同时引用无效。