假设A类有一个成员变量(它是一个对象而不是一个引用)m。我自然会认为: 当我定义一个对象' o1'时,表达' o1.m'也是一种对象类型; 当我定义参考' q1'时,表达' q1.m'也是一种参考类型。
这个结论是否正确?我想知道C ++标准文档中的相关条款是什么,如果它是真的(我已经搜索了它/它们已经多了几天但几乎所有关于'引用作为类的成员& #39;到目前为止)?
答案 0 :(得分:2)
查看§5.2.5( Postfix Expressions 中的类成员访问,来自N3797 C++14 Draft):
将postfix-expression.id-expression缩写为E1.E2,E1称为对象表达式。 E1.E2的类型和值类别确定如下。在5.2.5的其余部分中,cq表示const或不存在const,vq表示挥发性或不存在挥发性。 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是一个x值。让符号vq12代表vq1和vq2的“联合”;也就是说,如果vq1或vq2是易失性的,则vq12是易失性的。同样,让符号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不是引用类型。