使用标准中的8.5.3p4,如何确定T与T&?的参考兼容?

时间:2013-07-02 14:33:57

标签: c++ c++11 standards language-lawyer

鉴于

T w;
T& t = w;

如何使用8.5.3p4和p5建立r绑定到t以下T,即T&T& r = t; 的参考兼容?< / p>

T

观察T&T&的类型不同,既不是T的基类,依据8.5.3p4我们也不能说T& }是与{{1}}相关的参考。

2 个答案:

答案 0 :(得分:2)

短篇小说:

T&与<{1}}的参考兼容,但这与此无关。

TT(本身)引用兼容。该事实用于应用8.5.3p5。请注意8.5.3p5 “引用类型cv1 T1 ...”的前几个单词。所以T,而不是cv1 T1 is T

长篇故事:

cv1 T1 is T&

T& r = t; t类型的表达式(引用是从表达式条带化的。表达式T的类型不是t,尽管事实上类型为lvalue-reference to T变量名称是)具有值类别lvalue

T&r = t;是一个声明,声明并初始化r类型的变量lvalue-reference to T,使用前面提到的表达式进行复制初始化。

此初始化的操作是直接引用绑定。

在这种情况下,T与引用相关且与引用兼容,因为相同类型相同的cv限定

8.5.3p4只定义了这两种类型的关系。

现在,再看看为您的具体示例重写的8.5.3p5:

  

对“T”类型的引用由“T”类型的表达式初始化:

     
      
  • 如果引用是左值引用和初始化表达式

  •   
    •   
    • 左值“T”与“T”引用兼容
    •   
  •   

所以T这里是值类型,而不是引用类型。

答案 1 :(得分:2)

表达式'T&amp; r = t;“标准中的类型T,而不是T&amp;,5/5,如下:

  

如果表达式最初具有“引用T”类型(8.3.2,   8.5.3),在进一步分析之前将类型调整为T.表达式指定由引用表示的对象或函数,   并且表达式是左值或右值,具体取决于   表达