C++ 引用声明是否为引用对象引入了新名称?

C++ 引用声明是否为引用对象引入了新名称?,c++,c++11,language-lawyer,c++14,c++03,C++,C++11,Language Lawyer,C++14,C++03,在中,我们了解到RVO不能应用于像p.first这样的表达式 在评论中还建议,RVO通常不适用于r之类的表达式,在auto&r=p.first之类的声明之后。标准是否规定了这种行为尚不清楚 在具有类返回类型的函数中的return语句中,当表达式是与函数返回类型具有相同类型(忽略cv限定)的非易失性自动对象的名称(函数参数或处理程序([except.handle])的异常声明引入的变量除外)时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作 在下面的代码中,r对象的名称是否也被称为

在中,我们了解到RVO不能应用于像
p.first
这样的表达式

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

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

在下面的代码中,
r
对象的名称是否也被称为
o
,只要在
return
语句中形成表达式时允许RVO

int o = 42;
int& r = o;
解决了引用与对象不同,没有实际名称这一事实。它由解决,它扩展了变量的概念以包含引用,从而为引用命名。
现在[basic]/6读到(全部由我强调):

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

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

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



由于上述论文直到2009才被采用,并附有标记:人们可以认为该论文是C++ 03的回顾性修正。但是,在C++03中,严格地说,引用不是实体(这已由更正),因此其声明中的标识符从未被视为名称(请参见[basic]/4,名称必须表示标签或实体)-因此复制省略也不适用。

r
不是对象的名称,而是引用的名称(标准在这里调用
int&r
void(&r)(
一个“对象声明”,但仍然没有帮助)@ᐅ约翰内斯乔布利特ᐊ: 你对另一个线程的评论非常有洞察力;你会考虑把它们写成一个答案吗?与《代码》> DeCype < /C>的描述相比:“如果E是一个未加括号的ID表达式或一个未加括号的类成员访问([ExpR.REF]),则DeCype(E)是由E命名的实体的类型。“name of…”etc用于引用名称查找结果。您不希望
decltype(r)
int
我不认为表达式是名称(因此std文本是胡言乱语);重要的是表达式在运行时指定对象。@curiousguy表达式不是名称,但名称是表达式(虽然它的等价关系不仅仅包括某些形式的名称,它们的文本表示肯定是一种表达,因此该标准的文本在这方面是正确的:p)。您是否认为
[dcl.ref]
中的[非规范性]注释(“引用可以被视为对象的名称”)现在是否存在误导性/混淆性,应予以删除?@LightnessRacesinOrbit我认为这是一个对初学者的合理解释。然而,这样的解释在标准化文件中没有一席之地,IMHO。有很多这样的“初学者”解释散布在各处——我觉得特别有趣的是mnemotechnic诗句:“在编写专业时,要注意它的位置;否则将其编撰将是一种考验,会点燃它的自焚之火。”(14.7.3/7中的规范性措辞)我只看到了我的通知箱里的第一句话,准备好了过来,用湿鳟鱼把你拍到脸上,建议ISO C++标准适合初学者。我想知道,允许引用变量的名称为“name”会有什么害处对象的?在这种特殊情况下,通过名称、省略或隐式移动返回对本地存储对象的引用似乎和通常一样无害。我想不出一个构造会使其严重损坏;有时编译器会遇到难以置信的困难,但不会损坏。我猜是移动(当省略失败时)是强制的吗?…好吧,这可能会使编译器死掉:引用可能是本地的。