【问题标题】:C++: why is iter++->empty() legal?C++:为什么 iter++->empty() 合法?
【发布时间】:2021-04-06 09:13:39
【问题描述】:

C++ Primer, 5e 的练习 4.20 询问表达式 iter++->empty(); 是否合法。假设itervector<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


【解决方案1】:

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

【讨论】:

  • 有趣,感谢您的链接。这与 C++ Primer,第 5 版的第 166 页表相矛盾。这有没有可能是最近对标准的更改?
  • @KevinBradner AFAIK,一直都是这样。
  • @KevinBradner 对不同的后缀一元运算符具有不同的优先级并没有多大意义(对于前缀运算符也是如此)。
  • 我假设它与关联性有关。根据我的参考, (->) 是左结合的,后缀 (++) 是右结合的。如果运算符处于相同的优先级,我不确定这些如何解决。
  • @KevinBradner 谢谢。对我来说,这张桌子看起来很糟糕。
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2018-10-12
  • 1970-01-01
  • 2017-01-05
相关资源
最近更新 更多