2

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

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

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

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

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

当函数被内联时会发生什么(很可能它们会被内联!)?

4

3 回答 3

4

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

如果运算符++被函数重载,则在调用函数时和返回时都会有一个序列指针。另一方面,调用函数的顺序仍然是未指定的,因此比较的结果是未指定的。

于 2013-11-04T10:09:19.507 回答
1

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

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

于 2013-11-04T10:15:44.873 回答
0

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

于 2013-11-04T12:23:01.047 回答