C++迭代器的未排序修改
C++ unsequenced modifications for iterators
我在迭代器的一个单元测试中有下一个代码:
EXPECT_TRUE(++it != it++);
it
尊重标准迭代器要求的地方。
据我所知,同一序列点中同一变量的 2 次修改是未定义的行为(!=
不是序列点)。
考虑到两个operator++
版本都是具有return
语句(序列点)的函数,在这些情况下是否适用未定义的行为?如果没有,为什么我在 Apple LLVM 5.0 编译器上收到"Multiple unsequenced modifications to it"
警告?
当函数被内联时会发生什么(很可能是这样!
首先,在某些情况下,"迭代器"可能只是一个typedef
一个指针,因此将没有序列点(或者在 C++11 中,操作不会排序)在表达式中,并且您有未定义的行为。
如果 ++
运算符重载了函数,则在调用函数时都有一个序列指针,以及当它返回时。 另一方面,顺序调用的函数仍未指定,因此比较未指定。
即使两个运算符是函数调用,行为也不是未定义的,但它们以未指定的顺序计算:编译器可以自由地先计算++it
,然后it++
或相反。结果可能不同。该测试假定从左到右的顺序,但不能保证。
函数是否内联并不重要:内联是一种优化,即不允许更改定义良好的程序的含义。当然,在内联内容时,编译器最终可能会在求值顺序方面做出不同的选择。但是,编译器在每次调用时都可以自由地做出不同的选择。
关键是它是否以相同的顺序发生......一个连续点只是结束了序列,所以你正在做的正是你已经说过的,你在同一调用中对同一变量进行了修改,而不是被序列点切断。
相关文章:
- 选择排序C++(已修改)并非适用于所有情况
- 类(可能是代理)的命名,允许在不修改基础容器的情况下对项目进行排序和删除
- 如何使用用户定义的键控制和修改 std::map 排序
- 内存排序或读取-修改-写入操作,仅(读/写)内存顺序
- 修改的选择排序,选择最大的数字,然后交换到最后
- 带修改(偏移)的气泡排序
- 如何修改函数以按C++的排序顺序插入每个项目
- 修改排序的数组或每次对数组进行排序
- 可修改的多集集:两级排序容器
- 排序向量不断修改数据并打印不正确的结果
- 通过修改链接来对链接列表进行排序
- 修改气泡排序的程序出错
- C++迭代器的未排序修改
- 修改排序网络后的奇怪行为
- 使用树排序修改数组
- 在C++11中,未排序的修改警告变为结果未使用的警告
- C++:未排序的修改和对"i"的访问
- 修改c++ std::set中元素中与排序相关的部分
- c++中文件按修改时间排序
- 反转计数出现问题(修改合并排序的实现)