C++:为什么 iter++->empty() 合法?

C++: why is iter++->empty() legal?

C++ Primer 的练习 4.20,5e 询问表达式 iter++->empty(); 是否合法。假设 itervector<string>::iterator.

这个表达式是合法的。我用 gcc 编译了它,Stack Overflow 上 another question 的答案已经解决了很多问题。但是,我很困惑为什么它是合法的。

类似问题的

This answer 给出了以下等价的表达式对:

iter->empty();
iter++;

我书中的运算符优先级 table 列出 -> 比后缀 ++ 运算符具有更高的优先级。这与上面等效代码中的明确操作顺序相匹配。然而,我习惯于看到运算符应用于它们旁边的任何东西。在 -> 的情况下,我希望编译器将它应用于 ++(通过自身,没有 iter)并抛出错误。也就是说,我试图把原来的表达式用括号括起来iter(++->empty());,这显然是不合法的

因此,似乎 C++ 要求编译器以更复杂的方式解析表达式,而不仅仅是基于优先级和关联性的括号。那正确吗?如果有一种简单的方法可以解释这实际上是如何发生的,我想知道它。

Per cppreference++-> 具有相同的优先级并且具有从左到右的结合性。这意味着先执行 iter++,然后将 ->empty() 应用于 iter++ 的结果,这只是 iter(自增量之前),因为它是后缀增量.