我在迭代器的一个单元测试中有下一个代码:
EXPECT_TRUE(++it != it++);
it
尊重标准迭代器要求。
据我所知,同一序列点中同一变量的2个修改是未定义的行为(!=
不是序列点)。
考虑两个operator++
版本是具有return
语句(序列点)的函数,在这些情况下是否适用未定义的行为?如果不是,为什么我在Apple LLVM 5.0编译器上收到"Multiple unsequenced modifications to it"
警告?
内联函数时会发生什么(最有可能是!)?
答案 0 :(得分:4)
首先,在某些情况下,“迭代器”可能只是typedef
一个指针,所以没有序列点(或者在C ++ 11中,
在表达式中,操作将不会被排序)
未定义的行为。
如果 ++
运算符超载了某个函数,那么就可以了
在调用函数时都有一个序列指针,和
什么时候回来。另一方面,顺序在哪里
调用的函数仍然是未指定的,所以结果如此
比较未指明。
答案 1 :(得分:1)
即使两个运算符都是函数调用,行为也不是未定义的,它们会以未指定的顺序进行评估:编译器可以自由地首先评估++it
然后it++
或反之。结果可能不同。该测试采用从左到右的顺序,但不能保证。
函数是否内联无关紧要:内联是一种优化,即不允许改变明确定义的程序的含义。当然,在内联时,编译器可能最终在评估顺序方面做出不同的选择。但是,每次调用它时,编译器都可以自由地做出不同的选择。
答案 2 :(得分:0)
关键是如果它发生在相同的序列中......一个序列点jsut结束序列,所以你正在做的正是你已经说过的,你在同一个调用中修改了同一个变量没有被序列点切断。