【发布时间】:2021-04-06 09:13:39
【问题描述】:
C++ Primer, 5e 的练习 4.20 询问表达式 iter++->empty(); 是否合法。假设iter 是vector<string>::iterator。
这个表达式是合法的。我用 gcc 编译了它,Stack Overflow 上another question 的答案已经解决了这么多。但是,我对为什么它是合法的感到困惑。
This answer 对一个类似的问题给出以下作为等效的表达式对:
iter->empty();
iter++;
我书中的运算符优先级表将-> 列为比后缀++ 运算符具有更高的优先级。这与上面等效代码中的显式操作顺序相匹配。但是,我习惯于看到运算符适用于它们旁边的任何内容。在-> 的情况下,我预计编译器会将其应用于++(本身,没有iter)并抛出错误。也就是说,我试图把原来的表达式括起来为iter(++->empty());,这显然是非法的。
因此,似乎 c++ 要求编译器以更复杂的方式解析表达式,而不仅仅是基于优先级和关联性的括号。那正确吗?如果有一种简单的方法来解释这实际上是如何发生的,我想知道它。
【问题讨论】:
-
Why do you think it shouldn't be?
iter来自哪个容器类型? -
My table 表示他们的优先级相同。
-
请注意避免将“编译,因为它在语法上有效”中的“合法”与“已定义行为”中的“合法”混淆。
-
我认为您认为合乎逻辑的“明显非法”方法将成为它为什么不这样做的有力论据;解析的尝试没有意义,因为您不能将运算符附加到运算符,它必须附加到表达式,因此
iter++必须首先绑定。另外,你的书是错的,或者你读错了; postfix++has the same precedence as->(前缀++的优先级低于任何一个,但这里不涉及)。 -
我查看了 C++ Primer 中的优先级表,它在几个方面肯定是错误的,甚至毫无意义。 Postfix ++ 具有正确的关联性?真的吗?我想试试他们抽的是什么。您如何解释这句话?
标签: c++ pointers post-increment