C ++对迭代器的无序修改

时间:2013-11-04 09:51:47

标签: c++ undefined-behavior sequence-points

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

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

it尊重标准迭代器要求。

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

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

内联函数时会发生什么(最有可能是!)?

3 个答案:

答案 0 :(得分:4)

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

如果 ++运算符超载了某个函数,那么就可以了 在调用函数时都有一个序列指针,和 什么时候回来。另一方面,顺序在哪里 调用的函数仍然是未指定的,所以结果如此 比较未指明。

答案 1 :(得分:1)

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

函数是否内联无关紧要:内联是一种优化,即不允许改变明确定义的程序的含义。当然,在内联时,编译器可能最终在评估顺序方面做出不同的选择。但是,每次调用它时,编译器都可以自由地做出不同的选择。

答案 2 :(得分:0)

关键是如果它发生在相同的序列中......一个序列点jsut结束序列,所以你正在做的正是你已经说过的,你在同一个调用中修改了同一个变量没有被序列点切断。