0

假设一个类 A 有一个成员变量(它是一个对象而不是一个引用)m。我自然会认为:当我定义一个对象'o1'时,表达式'o1.m'也是一个对象类型;当我定义一个引用“q1”时,表达式“q1.m”也是一个引用类型。

这个结论正确吗?我想知道 C++ 标准文档中是否有任何相关子句,如果它是真的(我已经搜索了它/它们已经多天了,但到目前为止几乎所有关于“作为类成员的引用”)?

4

1 回答 1

2

看看§5.2.5后缀表达式中的类成员访问,来自N3797 C++14 草案):

将postfix-expression.id-expression 缩写为E1.E2,E1 称为对象表达式。E1.E2 的类型和值类别确定如下。在 5.2.5 的其余部分中,cq 表示 const 或不存在 const,而 vq 表示 volatile 或不存在 volatile。cv 表示任意一组 cv 限定符,如 3.9.3 中所定义。

如果 E2 被声明为具有“对 T 的引用”类型,那么 E1.E2 是一个左值;E1.E2 的类型为 T。否则,适用以下规则之一。

  • 如果 E2 是一个非静态数据成员并且 E1 的类型是“cq1 vq1 X”,并且 E2 的类型是“cq2 vq2 T”,则表达式指定由第一个表达式指定的对象的命名成员。如果 E1 是左值,则 E1.E2 是左值;否则 E1.E2 是一个 xvalue。让符号 vq12 代表 vq1 和 vq2 的“并集”;也就是说,如果 vq1 或 vq2 是 volatile,则 vq12 是 volatile。类似地,让符号 cq12 代表 cq1 和 cq2 的“并集”;也就是说,如果 cq1 或 cq2 为 const,则 cq12 为 const。如果 E2 被声明为可变成员,则 E1.E2 的类型为“vq12 T”。如果 E2 未声明为可变成员,则 E1.E2 的类型为“cq12 vq12 T”。

即使 E1 是,该标准也没有说明 E2 成为参考。明确地说,如果 E1 是引用类型而 E2 不是,则 E1.E2 不是引用类型。

于 2014-12-07T17:15:31.383 回答