是什么使得这些迭代器比较具有未定义的行为

What makes these iterator comparisons undefined behavior?

本文关键字:未定义 比较 迭代器 是什么      更新时间:2023-10-16

在n3644-空正向迭代中,它说:

将值初始化的迭代器与迭代器进行比较的结果具有非奇异值是未定义的。

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.
  • 非奇异值是什么意思
  • 为什么会出现这种未定义的行为

您会问两个截然不同的问题。你关于单数与非单数的问题已经在这里回答了,所以我将忽略这个问题,只关注不重复的问题。

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

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

对于这些情况,要求进行比较以评估为false意味着强制更改实现。

未定义比较可以为实现提供所需的自由度。

Xarn在评论中指出,让比较给出一个未指定的结果(falsetrue,但没有其他选项)可能是更好的选择。这本来是一个有效的选择,但在提出该建议时的行为已经是不允许与不来自同一容器的迭代器进行比较(未定义的行为,而不是未指定的结果),据我所知,该建议只是寻求不更改任何不必要的内容,所以保持原样。

使其未定义而不是未指定的一个有效论点是,某些实现可能希望提供特殊的调试迭代器,在这种情况下,无效比较(几乎可以肯定是程序员错误)会用有用的消息中止程序。