Lig*_*ica 20 c++ language-lawyer c++11 c++03 c++14
在这个问题中,我们已经知道RVO不能应用于像这样的表达式p.first.
在评论中,还建议RVO通常不适用于像r声明之类的表达式auto& r = p.first.标准是否要求这种行为尚不清楚.
在具有类返回类型的函数的return语句中,当表达式是非易失性自动对象的名称时(除了函数参数或由处理程序的异常声明引入的变量([except.handle]) ))具有与函数返回类型相同的类型(忽略cv-qualification),通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作
在下面的代码中,对象r的名称是否也称为o,当RVO在return语句中形成表达式时允许使用RVO ?
int o = 42;
int& r = o;
Run Code Online (Sandbox Code Playgroud)
Col*_*mbo 18
CWG#633解决了这样一个事实,即与对象不同,引用没有实际名称.它由 N2993解决,它扩展了变量的概念以包含引用,从而赋予它们名称.
现在[基本]/6读(所有强调我):
通过声明除非静态数据成员或对象之外的引用引入变量.变量的名称表示对象或引用.
引用的名称表示变量 - 引用 - 而不是引用引用的对象.虽然引用通常被解释为"对象/函数的其他名称",但在标准术语中,定义是完全错误的.
即复制省略不适用于您的示例.
由于上述论文直到2009年才被采用,并且您标记了c ++ 03:人们可以将该论文视为对C++ 03的回顾性修正.但是,在C++ 03中,严格来说,引用不是实体(这是由CWG#485纠正的),因此其声明中的标识符永远不会被视为名称(参见[basic]/4,名称必须表示标签或实体) - 因此复制省略不再适用.
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |