问题描述
C++ Primer,5e 的练习 4.20 询问表达式 iter++->empty();
是否合法。假设 iter
是 vector<string>::iterator
。
这个表达式是合法的。我用 gcc 编译它,Stack Overflow 上 another question 的答案已经解决了很多问题。但是,我很困惑为什么这是合法的。
This answer 到一个类似的问题给出以下作为一对等价的表达式:
iter->empty();
iter++;
我书中的运算符优先级表将 ->
列为比后缀 ++
运算符具有更高的优先级。这与上面等效代码中的显式操作顺序相匹配。但是,我习惯于看到运算符适用于它们旁边的任何内容。在 ->
的情况下,我预计编译器会将它应用于 ++
(单独使用,没有 iter
)并抛出错误。换句话说,我试图将原始表达式括起来为iter(++->empty());
,这显然是非法的。
因此,似乎 c++ 需要编译器以更复杂的方式解析表达式,而不仅仅是基于优先级和关联性的括号。是对的吗?如果有一种简单的方法来解释这实际上是如何发生的,我想知道。
解决方法
Per cppreference、++
和 ->
具有相同的优先级并且具有从左到右的结合性。这意味着先执行 iter++
,然后将 ->empty()
应用于 iter++
的结果,它只是 iter
(从增量之前),因为它是后缀增量.