C++迭代器的未排序修改

C++ unsequenced modifications for iterators

本文关键字:排序 修改 迭代器 C++      更新时间:2023-10-16

我在迭代器的一个单元测试中有下一个代码:

EXPECT_TRUE(++it != it++);

it尊重标准迭代器要求的地方。

据我所知,同一序列点中同一变量的 2 次修改是未定义的行为(!=不是序列点)。

考虑到两个operator++版本都是具有return语句(序列点)的函数,在这些情况下是否适用未定义的行为?如果没有,为什么我在 Apple LLVM 5.0 编译器上收到"Multiple unsequenced modifications to it"警告?

当函数被内联时会发生什么(很可能是这样!

首先,在某些情况下,"迭代器"可能只是一个typedef一个指针,因此将没有序列点(或者在 C++11 中,操作不会排序)在表达式中,并且您有未定义的行为。

如果 ++ 运算符重载了函数,则在调用函数时都有一个序列指针,以及当它返回时。 另一方面,顺序调用的函数仍未指定,因此比较未指定。

即使两个运算符是函数调用,行为也不是未定义的,但它们以未指定的顺序计算:编译器可以自由地先计算++it,然后it++或相反。结果可能不同。该测试假定从左到右的顺序,但不能保证。

函数是否内联并不重要:内联是一种优化,即不允许更改定义良好的程序的含义。当然,在内联内容时,编译器最终可能会在求值顺序方面做出不同的选择。但是,编译器在每次调用时都可以自由地做出不同的选择。

关键是它是否以相同的顺序发生......一个连续点只是结束了序列,所以你正在做的正是你已经说过的,你在同一调用中对同一变量进行了修改,而不是被序列点切断。