c++编译器可以对const返回值执行RVO吗?

Can a C++ compiler perform RVO for a const return value?

本文关键字:执行 RVO 返回值 const 编译器 c++      更新时间:2023-10-16

假设我有一个函数

#include <string>
std::string const foo()
{
    std::string s = "bar";
    return s;
}
int main()
{
    std::string t = foo();
}

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

(如果c++ 03和c++ 11的答案不同,那么我绝对有兴趣知道c++ 03的答案。)

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


然而,移动语义受到const的影响。它有效地禁用了移动语义,即调用T(T&&)构造函数或移动赋值操作符。所以一般来说,不要对返回值使用const

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

然后Andrei Alexandrescu在他为DDJ撰写的Mojo文章中指出,从此以后,对于move语义,返回值的const最好被禁止,而Scott之前的建议被忽略。


现在我再也懒得去学习各种专门的RVO缩写了,比如NRVO等等。一个主要原因是这些在中途改变了的含义,最初在g++编译器中具有一些自定义功能的含义。这里的术语真是一团糟。

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