C ++编译器可以对用于返回值的命名const变量执行RVO吗?

时间:2019-05-17 23:23:23

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

该问题与相关问题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执行(命名)返回值优化?

1 个答案:

答案 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对象移动)…