该问题与相关问题shown here略有不同。
在C ++ 17中,我有一个本地变量,我想作为常量来证明它是根据use const whenever possible的Scott Meyers Effective C ++ 第3条建议创建的,未经修改。 >
#include <string>
std::string foo()
{
const std::string str = "bar";
return str;
}
int main()
{
std::string txt = foo();
}
即使txt
的类型与str
的返回类型由于常量性差异而不同,编译器是否可以为foo
执行(命名)返回值优化?
答案 0 :(得分:3)
通过在[class.copy.elision]中的C ++ 17中指定的复制省略来启用命名的返回值优化。这里的相关部分是[class.copy.elision]/1.1:
当满足某些条件时,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用,也允许实现忽略类对象的复制/移动构造。 […]
- 在具有类返回类型的函数中的
return
语句中,如果表达式是非易失性自动对象的名称(函数参数或由变量的异常声明引入的变量除外)与函数返回类型具有相同类型(忽略cv限定)的处理程序([except.handle])),可以通过将自动对象直接构造到函数调用的函数中来省略复制/移动操作返回对象[…]
强调我的。因此,允许编译器在此处执行优化。并且a quick test似乎可以验证编译器将在此处实际执行此优化…
请注意,const
可能还是有问题的。如果编译器不执行复制省略(仅允许这样做,不保证在此发生;即使在C ++ 17中,由于return
语句中的表达式不是prvalue),const
通常将防止移动对象(通常无法从const
对象移动)…