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

Kev*_*ner 2 c++ pointers post-increment

C++入门练习4.20,5e问表达式iter++->empty();是否合法。假设这iter是一个vector<string>::iterator.

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

This answer to a similar question给出了以下作为一对等价的表达式:

iter->empty();
iter++;
Run Code Online (Sandbox Code Playgroud)

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

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

Nat*_*ica 5

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

  • @KevinBradner 谢谢。对我来说看起来是一张糟糕的桌子。 (2认同)