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

标签 c++ pointers post-increment

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

相关文章:

c++ - boost::regex 与 UTF-8 不区分大小写匹配(例如,大写与小写变音)

c++ - 如何获取类中成员函数的地址

c - 使用预递增运算符指向指针取消引用的指针

c++ - C++ 中的指针,原始内存操作

c++ - 在列表中的结构中访问/分配值的问题 - C++

c++ - 后递增运算符如何工作。有异常(exception)吗?

c# - 为什么我不能用类 C 语言做++i++?

c++ - 返回两个用户输入值的函数

c++ - Visual Studio 2015 - 编译器警告(2 级)C4146

c++ - *it++ 如何对输出迭代器有效?