对于第一个选项(点),第一个表达式应是具有完整类类型的泛左值。对于第二个选项(箭头),第一个表达式应是具有指向完整类类型的指针的纯右值。表达式 E1->E2 被转换为等价形式 (*(E1)).E2;[expr.ref] 的其余部分将仅处理第一个选项(点)。68在任何一种情况下,id 表达式都应命名该类或其基类之一的成员。[ 注意:因为类名插入到其类范围内(子句 [class]),所以类名也被认为是该类的嵌套成员。— end note ] [ 注意:[basic.lookup.classref] 描述了如何在 . 和 -> 运算符。——尾注]
根据本段,在p
下面的代码段中应用了左值到右值的转换。但不适用于a
. 为什么标准为第一个选项(点)规定了一个左值,为第二个选项(箭头)规定了一个纯右值?
struct A{ void f() {} };
A a;
A* p = new A;
int main() {
a.f();
p->f();
}