In 这个问题 https://stackoverflow.com/q/33344259/560648我们知道 RVO 不能应用于像这样的表达式p.first
.
在评论中还建议 RVO 通常不适用于类似这样的表达式r
在声明之后auto& r = p.first
。目前尚不清楚该标准是否强制要求这种行为。
在具有类返回类型的函数的 return 语句中,当表达式为非易失性自动对象的名称(除了函数参数或由处理程序的异常声明引入的变量([except.handle]))与函数返回类型具有相同类型(忽略 cv 限定)时,可以省略复制/移动操作通过将自动对象直接构造到函数的返回值中
在下面的代码中,是r
a name对象的也称为o
,当 RVO 形成表达式时是允许的return
陈述?
int o = 42;
int& r = o;
CWG #633 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#633解决了引用与对象不同的事实,它没有实际的名称。已解决N2993 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2993.html,它将变量的概念扩展到包含引用,从而给它们命名。
现在[基本]/6阅读(都是我强调的):
变量是通过声明非静态数据成员或对象的引用来引入的。变量的名称表示对象或参考.
引用的名称表示该变量 -参考- 不是引用引用的对象。尽管引用通常被解释为“对象/函数的其他名称”,但用标准术语来说,这个定义是完全错误的。
IE。复制省略不适用于您的示例。
由于上述论文直到 2009 年才被采用,并且您标记为c++03 /questions/tagged/c%2b%2b03:可以将这篇论文视为对 C++03 的回顾性修正。然而,在 C++03 中,严格来说,引用不是实体(这已由CWG #485 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#485),因此其声明中的标识符永远不会被视为名称(参见 [basic]/4,名称必须表示标签或实体) - 因此复制省略再次不适用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)