c++ - 是什么导致这些迭代器比较未定义的行为?

标签 c++ undefined-behavior

n3644 - Null Forward Iterators ,它说:

The result of comparing a value-initialized iterator to an iterator with a non-singular value is undefined.

vector<int> v = {1,2,3};
auto ni = vector<int>::iterator();
auto nd = vector<double>::iterator();
ni == ni; // True.
nd != nd; // False.
v.begin() == ni; // Undefined behavior (likely false in practice).
v.end() == ni; // Undefined behavior (likely false in practice).
ni == nd; // Won’t compile.
  • 非奇异值是什么意思?
  • 为什么这是未定义的行为?

最佳答案

你问了两个截然不同的问题。您关于单数与非单数的问题 is already answered here ,所以我将忽略该问题,只关注不重复的问题。

某些容器可能使用特殊的迭代器值,这些值看起来与默认构造的迭代器值完全一样。例如,对于 end() 返回的迭代器没有有效指针值的迭代器可以使用其迭代器类型的等效空指针来表示这些迭代器。

对于这些情况,要求比较评估为 true 意味着实现被迫永不改变,即使将来为这些迭代器值设计了更好的方法也是如此。

对于这些情况,要求比较评估为 false 意味着实现被迫更改。

使比较未定义为实现提供了他们可能需要的自由。

Xarn 在评论中指出,让比较给出未指定的结果可能是更好的选择(falsetrue,但没有其他选择) .那将是一个有效的选择,但提案时的行为已经禁止与不是来自同一容器的迭代器进行比较(未定义的行为,不是未指定的结果),据我所知,这提案只是试图不改变任何不必要的东西,所以保持原样。

使它成为未定义而不是未指定的一个有效论据是,某些实现可能希望提供特殊的调试迭代器,其中无效比较几乎肯定是程序员错误,并用有用的消息中止程序。

关于c++ - 是什么导致这些迭代器比较未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26206188/

相关文章:

c++ - 在不复制数据的情况下,决定 what() 从继承自 std::system_error 的类返回什么的符合标准的方法是什么?

c++ - 程序错误 "error C3861: ' copyString' : identifier not found", 请告诉我为什么?

c++ - 克隆的 shared_ptr 和析构函数中的泄漏

c++ - 基于值(value)的向上转型

c - 为什么使用后要检查指针是否为NULL?

c - 为什么这些构造使用增量前和增量后未定义的行为?

c - idiv 指令的不同结果

c++ - 为什么 `printf("%llu\n", 1ull << n) ;` and ` printf ("%llu\n", 1ull << 64);` 的输出在 C++ 中不同?(n=64)

c++ - boost::adaptors::transformed 后跟 boost::adaptors::filtered 调用函数两次

c++ - 头文件中的类定义 C++