C++ 编译器能否对用于 return 值的命名 const 变量执行 RVO?
Can a C++ compiler perform RVO for a named const variable used for the return value?
此问题是相关问题 shown here 的细微变体。
在 C++17 中,我有一个局部变量,我想将其设为 const 以证明它一旦根据 Scott Meyers Effective C++ 项目 3 推荐 [=16] 创建后就不会被修改=]:
#include <string>
std::string foo()
{
const std::string str = "bar";
return str;
}
int main()
{
std::string txt = foo();
}
编译器可以为 txt
执行(命名的)return 值优化,即使 str
的类型不同于 return 的类型 foo
由于常量差异?
指定的 return 值优化通过 C++17 中指定的复制省略在 [class.copy.elision]. The relevant part here is [class.copy.elision]/1.1:
中启用
When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the constructor selected for the copy/move operation and/or the destructor for the object have side effects. […]
- in a
return
statement in a function with a class return type, when the expression is the name of a non-volatile automatic object (other than a function parameter or a variable introduced by the exception-declaration of a handler ([except.handle])) with the same type (ignoring cv-qualification) as the function return type, the copy/move operation can be omitted by constructing the automatic object directly into the function call's return object
[…]
强调我的。因此,允许编译器在此处执行优化。 a quick test 似乎可以验证编译器实际上会在这里执行此优化......
请注意,const
可能仍然存在问题。如果编译器不执行复制省略(这里只允许,不保证会发生;即使在 C++17 中,因为 return
语句中的表达式不是纯右值),const
通常会防止对象被移动(通常不能从 const
对象移动)…
此问题是相关问题 shown here 的细微变体。
在 C++17 中,我有一个局部变量,我想将其设为 const 以证明它一旦根据 Scott Meyers Effective C++ 项目 3 推荐 [=16] 创建后就不会被修改=]:
#include <string>
std::string foo()
{
const std::string str = "bar";
return str;
}
int main()
{
std::string txt = foo();
}
编译器可以为 txt
执行(命名的)return 值优化,即使 str
的类型不同于 return 的类型 foo
由于常量差异?
指定的 return 值优化通过 C++17 中指定的复制省略在 [class.copy.elision]. The relevant part here is [class.copy.elision]/1.1:
中启用When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the constructor selected for the copy/move operation and/or the destructor for the object have side effects. […]
- in a
return
statement in a function with a class return type, when the expression is the name of a non-volatile automatic object (other than a function parameter or a variable introduced by the exception-declaration of a handler ([except.handle])) with the same type (ignoring cv-qualification) as the function return type, the copy/move operation can be omitted by constructing the automatic object directly into the function call's return object[…]
强调我的。因此,允许编译器在此处执行优化。 a quick test 似乎可以验证编译器实际上会在这里执行此优化......
请注意,const
可能仍然存在问题。如果编译器不执行复制省略(这里只允许,不保证会发生;即使在 C++17 中,因为 return
语句中的表达式不是纯右值),const
通常会防止对象被移动(通常不能从 const
对象移动)…