c++编译器可以对const返回值执行RVO吗?
Can a C++ compiler perform RVO for a const return value?
假设我有一个函数
#include <string>
std::string const foo()
{
std::string s = "bar";
return s;
}
int main()
{
std::string t = foo();
}
由于const
的差异,即使s
和t
的返回类型与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++编译器中具有一些自定义功能的含义。这里的术语真是一团糟。
所以,如果我的术语错了,我真的应该用一些其他的缩写词,那么请随时纠正!: -)
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么不执行"partial RVO"?
- C 编译器可以执行用于返回值的命名const变量的RVO
- 当使用三元运算符并删除移动/复制CTOR时,Visual Studio不执行RVO
- 为什么Visual Studio在这种情况下不执行返回值优化(RVO)
- 编译器何时执行RVO ?
- c++编译器可以对const返回值执行RVO吗?