【发布时间】:2016-06-15 20:26:24
【问题描述】:
我正在查看有关成员引用运算符(一元 * 取消引用运算符、-> 成员访问运算符)以及许多其他相关问题的 C++ 标准:
C++ - Difference between (*). and ->?
ptr->hello(); /* VERSUS */ (*ptr).hello();
C++ pointers difference between * and ->
我看到大多数答案都表明 p->m 是 C++ 标准(5.2.5,第 2 段)定义的 (*p).m 的语法糖:
表达式
E1->E2被转换为等价形式(*(E1)).E2
许多 cmets 还指出,由于 operator* 和 operator-> 在类中是可重载的,因此应统一重载它们以确保行为一致。
这些陈述似乎相互矛盾:如果(根据标准)E1->E2 转换为等效形式(*(E1)).E2,那么重载operator-> 的目的是什么(标准允许) ?
简单地说,标准的这两个部分是否存在冲突,还是我误解了标准?E1->E2 到 (*(E1)).E2 的等价转换适用于所有完整类型还是仅适用于内置类型?
【问题讨论】:
-
参见第 5 条的第 3 点,“第 5 条定义了运算符在应用于未重载的类型时的效果。”
标签: c++ pointers language-lawyer