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