为什么返回的值必须是 NRVO 的第一个本地声明值
Why does the returned value need to be the first declared local for NRVO?
我的理解是,为了使编译器能够执行命名返回值优化(NRVO),必须在函数体中的任何其他返回值之前声明返回值。我怀疑这可能是由于发生异常时堆栈展开的顺序,但我不确定。命名返回值必须是函数体中第一个声明的原因是什么?
class C{};
C f(){
C ret; //NRVO possible
return ret;
}
C g(){
int i;
C ret; //NRVO not possible?
return ret;
}
用例:
auto c = f();
auto c2 = g();
编辑:谢谢所有回答者帮助我理解这一点,我开始怀疑钱德勒·卡鲁斯在这里的陈述:http://www.youtube.com/watch?v=fHNmRkzxHWs 分钟 32:30 可能具有误导性和/或我只是误解了它。首先对返回变量进行解码似乎并不重要。
该标准对有关复制省略的变量的声明/定义顺序没有要求。请注意,该标准说"允许实现",而不是应该、应该等。我们可以看到复制省略发生在clang
和gcc
,但不是MSVC
,这进一步巩固了这是一个实现定义的优化。
§12.8/31 描述了复制省略:
[..]在以下情况下允许对复制/移动操作进行这种省略,称为复制省略(可以合并到 消除多个副本):
— 在具有类返回类型的函数中的 return 语句中,当 表达式是非易失性自动对象的名称(其他 比函数或捕获子句参数)具有相同的 CV-非限定类型作为函数返回类型,复制/移动 通过直接构造自动对象可以省略操作 到函数的返回值中
— [..]
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 无法使我的第一个Windows OpenGL窗口抬起并运行
- 将参数初始化为构造函数,而不是第一个
- 无法在硬件模式下创建 SGX 安全区 - "invalid launch token"即使文档将无效的启动令牌指定为第一个