帖子我可以使用什么来代替箭头运算符`->`? 和箭头运算符 (->) 在 C 状态下的用法
以下两个表达式是等价的:
x->y (*x).y
但是,当被视为数学等价时,这似乎并不总是正确的。
为什么g++替换的时候会报错
a->b->c
和
a->(*b).c
?
似乎上述等价并不总是可以替换的。因此,我认为“等效”一词有点误导。
另外,在这个问题中,我并不是指任何类型的重载。
帖子我可以使用什么来代替箭头运算符`->`? 和箭头运算符 (->) 在 C 状态下的用法
以下两个表达式是等价的:
x->y (*x).y
但是,当被视为数学等价时,这似乎并不总是正确的。
为什么g++替换的时候会报错
a->b->c
和
a->(*b).c
?
似乎上述等价并不总是可以替换的。因此,我认为“等效”一词有点误导。
另外,在这个问题中,我并不是指任何类型的重载。
您的关联规则错误。a->b->c
是(a->b)->c
,不是a->(b->c)
,所以它变成(*(a->b)).c
(然后(*((*a).b)).c
)。
因为您没有正确替换运算符。它应该是:
(*(a->b)).c
你把你的表达a->(b->c)
当你应该把它当做(a->b)->c
您正在错误地进行替换。
a->b->c
相当于(*(a->b)).c
。
a->(*b).c
由于多种原因没有意义。b
不是可以取消引用的指针(指针是a->b
)。此外,即使是这样,在字段的上下文中使用取消引用的指针a
也没有意义。
您看到的问题是不同运算符的优先级问题,您应该使用:((*(x->y)).z
第二个操作数->
是(x->y)
and z
)。但这之前已经回答过了。
然而,重要的是要注意,等价仅适用于指针,并且两个运算符在重载时的属性完全不同。语言中的operator->
语义非常奇怪,从某种意义上说,它不代表单个操作,而是可以代表多个应用程序,operator->
直到重载的运算符产生一个原始指针,此时它将执行一个等效于取消引用的最后一个应用程序加访问(即仅用于最后一个应用程序,a->b
相当于(*a)->b
。)