5

这个问题是此处显示的相关问题的轻微变体。

在 C++17 中,我有一个局部变量,我想将其设为 const 以证明它在根据 Scott Meyers Effective C++ item 3 建议尽可能使用 const创建后未经修改:

#include <string>

std::string foo()
{
    const std::string str = "bar";

    return str;
}

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

编译器能否为 执行(命名)返回值优化txt,即使由于 const-ness 差异而导致的str类型与返回类型不同?foo

4

1 回答 1

4

命名的返回值优化由[class.copy.elision]中 C++17 中指定的复制省略启用。这里的相关部分是[class.copy.elision]/1.1

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。[…]

  • return具有类返回类型的函数的语句中,当表达式是非易失性自动对象的名称时(函数参数或由处理程序的异常声明引入的变量除外([except.handle]) ) 与函数返回类型相同的类型(忽略 cv 限定),可以通过将自动对象直接构造到函数调用的返回对象中来省略复制/移动操作

[…]

强调我的。因此,允许编译器在此处执行优化。快速测试似乎可以验证编译器实际上会在这里执行此优化……

请注意,const尽管如此,这可能是有问题的。如果编译器不执行复制省略(仅允许,但不保证在这里发生;即使在 C++17 中,因为return语句中的表达式不是纯右值),const通常会阻止对象被移动(通常不能从const物体上移动)…

于 2019-05-17T23:41:50.553 回答