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

Using 8.5.3p4 in the Standard, how do I establish that T is reference-compatible to a T&?

本文关键字:参考 何确定 标准 3p4      更新时间:2023-10-16

给定

T w;
T& t = w;

如何使用 8.5.3p4 和 p5 确定r绑定到下面的t,即TT&的引用兼容?

T& r = t;

观察TT&不是同一类型,也不是T&的基类,所以根据8.5.3p4我们不能说TT&有关。

表达式

'T& r = t;"中的初始值设定项在标准中具有 T,而不是 T&,按 5/5 计算,如下所示:

如果表达式最初具有"对 T 的引用"(8.3.2, 8.5.3(,在进行任何进一步分析之前,将类型调整为T。表达式指定由引用表示的对象或函数, 表达式是左值或 x值,具体取决于 表达。

短篇小说:

T&T不兼容,但这并不相关。

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

说来话长:

T& r = t;

t 是类型 T 的表达式(引用从表达式中条带化。 表达式的类型不是lvalue-reference to T t尽管它命名的变量的类型是(的值类别为 lvalue

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

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

在这种情况下,T既与参考相关,又与自身与参考兼容,因为它是具有相同 cv 资格相同类型

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

现在,再看看重写到您的特定示例的 8.5.3p5:

对类型"T"的

引用由类型"T">的表达式初始化:

  • 如果引用是左值引用和初始值设定项表达式

    • 是一个左值,"T">与"T"引用兼容

因此,此处T是值类型,而不是引用类型。