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