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

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中,严格来说,引用不是实体(这是由CWG#485纠正的),因此其声明中的标识符永远不会被视为名称(参见[basic]/4,名称必须表示标签或实体) - 因此复制省略不再适用.

  • 我只看到了SO通知栏中的第一句话,并准备好来到这里用湿鳟鱼拍打你的脸,以表明ISO C++标准首先适合初学者:) (3认同)
  • @LightnessRacesinOrbit我相信这对初学者来说是一个明智的解释.但是,这种解释在标准化文件中没有任何地方,恕我直言.有很多这样的"初学者"解释分散在各处 - 我发现特别有趣的mnemotechnic经文:*"在写专业时,要小心它的位置;或者使它编译将是一个试图点燃它自己-immolation."*(14.7.3/7中的规范性措辞). (2认同)
  • @Columbo:http://www.urbandictionary.com/define.php?term = trout +slap(SFW,只要你不向下滚动太远) (2认同)