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

问题描述

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

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

This answer一个类似的问题给出以下作为一对等价的表达式:

iter->empty();
iter++;

我书中的运算符优先级表将 -> 列为比后缀 ++ 运算符具有更高的优先级。这与上面等效代码中的显式操作顺序相匹配。但是,我习惯于看到运算符适用于它们旁边的任何内容。在 -> 的情况下,我预计编译器会将它应用于 ++(单独使用,没有 iter)并抛出错误。换句话说,我试图将原始表达式括起来为iter(++->empty());,这显然是非法的。

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

解决方法

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