是什么使得这些迭代器比较具有未定义的行为
What makes these iterator comparisons undefined behavior?
在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在评论中指出,让比较给出一个未指定的结果(false
或true
,但没有其他选项)可能是更好的选择。这本来是一个有效的选择,但在提出该建议时的行为已经是不允许与不来自同一容器的迭代器进行比较(未定义的行为,而不是未指定的结果),据我所知,该建议只是寻求不更改任何不必要的内容,所以保持原样。
使其未定义而不是未指定的一个有效论点是,某些实现可能希望提供特殊的调试迭代器,在这种情况下,无效比较(几乎可以肯定是程序员错误)会用有用的消息中止程序。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++自定义比较函数
- std::设置自定义比较器
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 从python调用openMP共享库时,未定义opnMP函数
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- std::map 的比较器函数中的 SEG 故障/未定义行为
- std::sort - 正在传递错误的比较器未定义的行为
- 是什么使得这些迭代器比较具有未定义的行为
- 是c++中指针比较未定义或未指定的行为