C ++编译器可以为const返回值执行RVO吗?

时间:2013-01-20 22:20:07

标签: c++ return-value-optimization nrvo

假设我有功能

#include <string>

std::string const foo()
{
    std::string s = "bar";
    return s;
}

int main()
{
    std::string t = foo();
}

编译器是否可以为t执行(命名)返回值优化,即使st的类型都与foo的返回类型不同由于const - 差异?

(如果C ++ 03和C ++ 11的答案不同,那么我肯定对了解C ++ 03的答案感兴趣。)

1 个答案:

答案 0 :(得分:9)

RVO优化无法打破const的承诺,因此没有问题:可以执行RVO。


但是,移动语义const的影响。它有效地禁用了移动语义,即调用T(T&&)构造函数或移动赋值运算符。因此,一般情况下,请勿在返回值上使用const

Scott Meyers最初建议const返回值,以获得更合理的编码。

然后Andrei Alexandrescu在他关于DDJ的Mojo文章中指出,从此以后,对于移动语义,应该更好地禁止返回值const,并忽略Scott先前的建议。


现在我从不费心去学习各种专门的RVO缩略词,​​比如NRVO等。主要原因是这些在中途改变了含义,最初在g ++编译器中具有一些自定义功能的含义。这里的术语只是一团糟。

所以,如果我的术语错了,我应该使用其他一些缩写词,那么请随意纠正! : - )