c++ - 为什么标准不允许 std::for_each 在无效的随机访问迭代器范围内具有明确定义的行为?

标签 c++ stl foreach iterator range

在此 question 据解释,std::for_each 在给定无效迭代器范围 [first, last) 时具有未定义的行为(即,当 last 无法通过先递增到达时)。

大概这是因为一个通用循环 for(auto it = first; it != last; ++it)将永远在无效范围内运行。但对于随机访问迭代器来说,这似乎是一个不必要的限制,因为随机访问迭代器有一个比较运算符,并且可以将显式循环写为 for(auto it = first; it < last; ++it)。 .这会将无效范围内的循环变成空操作。

所以我的问题是:为什么标准不允许 std::for_each 在无效的随机访问迭代器范围内具有明确定义的行为?它将简化几种只对多元素容器有意义的算法(例如排序)。使用 operator<() 而不是 operator!=() 是否会降低性能?

最佳答案

This would turn a loop over an invalid range into a no-op.

不一定是这样。

无效范围的一个示例是 firstlast 引用不同的容器。比较此类迭代器至少会导致未定义的行为 some cases .

关于c++ - 为什么标准不允许 std::for_each 在无效的随机访问迭代器范围内具有明确定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9174121/

相关文章:

c++ - vector emplace_back 困惑

c++ - 如何在C++中同步getter和setter方法

c++ - 如何初始化一个类数据成员,它是一个带有自定义比较器的 std::set

c++ - 如何将 std::transform 与模板一起使用

php - foreach 中 kohana orm find_all() 的奇怪行为

java - ForEach 循环中断和连接线程

c++ - c/c++ 在栈上分配

c++ - 生成可以区分 ID(Foo::a()) 和 ID(Foo::b()) 的唯一标识符

c++ - 通过包装容器减少 STL 代码膨胀

javascript - 将 $promise 数据放入 Javascript 数组中