【发布时间】:2019-05-17 23:23:23
【问题描述】:
这个问题是一个相关问题shown here的轻微变体。
在 C++17 中,我有一个局部变量,我想将其设为 const,以证明它在根据 Scott Meyers Effective C++ 向use const whenever possible 提出的第 3 项建议创建后未经修改:
#include <string>
std::string foo()
{
const std::string str = "bar";
return str;
}
int main()
{
std::string txt = foo();
}
编译器能否为txt 执行(命名)返回值优化,即使str 的类型与foo 的返回类型因常量差异而不同?
【问题讨论】:
-
语义上,
return str创建了一个对象,它是str的副本,因此 RVO 是可能的。是否可以执行 NVRO 值得怀疑,因为返回的对象需要与str不同。但是,如果函数与调用者在同一个编译单元中,则根据编译器执行的分析,它可以内联然后完全消除函数调用,并将std::string txt = foo()替换为std::string txt("bar")的名义等效项。 -
IANALL 但肯定
const必须应用于变量的范围以保证str在调用foo()期间保持不变。否则破坏如何运作?
标签: c++ c++17 return-value-optimization nrvo