C ++箭头运算符等价

时间:2012-07-16 19:31:45

标签: c++ pointers

帖子What can I use instead of the arrow operator, `->`?Arrow operator (->) usage in C 状态

  

以下两个表达式是等效的:

x->y
(*x).y

但是,当作为数学等价时,这似乎并不总是正确的。

为什么g ++在替换

时会抛出错误
a->b->c

a->(*b).c

似乎上述等价不是始终可替换。因此,我认为“等同”一词有点误导。

另外,我不是指这个问题中的任何超载。

4 个答案:

答案 0 :(得分:16)

你的关联规则错了。 a->b->c(a->b)->c,而不是a->(b->c),因此它变为(*(a->b)).c(然后是(*((*a).b)).c)。

答案 1 :(得分:8)

因为您没有正确更换操作符。它应该是:

(*(a->b)).c

当您将表达式视为a->(b->c)

时,您将表达式视为(a->b)->c

答案 2 :(得分:2)

您正在更换错误。

a->b->c相当于(*(a->b)).c

出于多种原因,

a->(*b).c没有意义。 b不是可以取消引用的指针(指针为a->b)。另外,即使是这样,在a字段的上下文中使用解除引用的指针也没有意义。

答案 3 :(得分:1)

您遇到的问题是不同运算符的优先级问题,您应该使用:(*(x->y)).z(第二个->的操作数为(x->y)和{{1} })。但这已经得到了回答。

然而,重要的是要注意,等效仅适用于指针,并且两个运算符在重载时的属性完全不同。 z在语言中有非常奇怪的语义,因为它不代表单个操作,但可以代表operator->的多个应用程序,直到重载的运算符产生一个原始指针,此时它将执行最后一个等同于dereference plus access的应用程序(即仅针对最后一个应用程序,operator->等同于a->b。)