引用声明是否为引用引用了新名称?

时间:2015-10-27 15:13:26

标签: c++ c++11 language-lawyer c++14 c++03

this question中,我们了解到RVO无法应用于p.first这样的表达式。

在评论中,还建议在r之类的声明之后,RVO通常不会应用于auto& r = p.first这样的表达式。标准是否规定了这种行为还不太清楚。

  

在具有类返回类型的函数的return语句中,当表达式是非易失性自动对象的名称时(除了函数参数或异常引入的变量之外)处理程序声明([except.handle]))具有与函数返回类型相同的类型(忽略cv-qualification),通过将自动对象直接构造到函数返回中,可以省略复制/移动操作值

在以下代码中,r对象的名称也称为o,只要在return中形成表达式时允许使用RVO {1}}陈述?

int o = 42;
int& r = o;

1 个答案:

答案 0 :(得分:18)

CWG #633解决了这样一个事实:与对象不同,引用没有实际名称。它由N2993解决,它将变量的概念扩展为包含引用,从而赋予它们名称 现在[基本] / 6读(我都强调):

  

变量是由非静态数据成员或对象以外的引用声明引入的。 变量的名称表示对象或引用

引用的名称表示该变量 - 引用 - 而不是引用所引用的对象。虽然引用通常被解释为"对象/函数的其他名称",但在标准术语中,定义是完全错误的。

即。复制省略不适用于您的示例。

由于上述论文直到2009年才被采用,并且你标记了:人们可以认为该论文是对C ++ 03的回顾性修正。但是,在C ++ 03中,严格来说,引用不是实体(这是由CWG #485纠正的),因此其声明中的标识符永远不会被视为名称(参见[basic] / 4,a名称必须表示标签或实体) - 因此复制省略不再适用。