11

假设我有这个功能

#include <string>

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

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

编译器能否为 执行(命名)返回值优化t,即使s和的类型由于-ness 差异而t与 的返回类型不同?fooconst

(如果 C++03 和 C++11 的答案不同,那么我肯定有兴趣知道 C++03 的答案。)

4

1 回答 1

14

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


但是,移动语义const. 它有效地禁用了移动语义,即调用T(T&&)构造函数或移动赋值运算符。所以一般来说,不要const在返回值上使用。

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

然后 Andrei Alexandrescu 在他为 DDJ 撰写的 Mojo 文章中指出,从今以后,使用移动语义,const最好禁止返回值,并且忽略 Scott 之前的建议。


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

所以,如果我的术语有误,我真的应该使用其他首字母缩写词,那么请随时纠正!:-)

于 2013-01-20T22:24:34.597 回答