C++中vector::end() + 1 != end()是标准定义还是编译器相关行为?
问题结论
你观测到的end() + 1 != end()的行为不属于C++标准明确定义的内容,完全是依赖编译器实现的巧合,因为**end() + 1这个操作本身就是未定义行为**。
标准相关规定
C++标准对vector的随机访问迭代器运算有明确的边界约束:
- 对于
vector<T> v,合法的迭代器取值范围是[v.begin(), v.end()],包含尾后迭代器v.end()本身 - 只有当迭代器加减运算的结果仍然落在上述合法范围内时,运算行为才是明确定义的
v.end() + 1已经超出了合法迭代器的取值范围,标准没有对该操作的结果做任何约束,编译器可以实现任意行为,包括你观测到的地址偏移结果、触发断言报错、返回和v.end()相等的值,甚至程序直接崩溃,都属于符合标准的表现
你测试结果的成因
你在g下看到的运算符合下标偏移的逻辑,是因为g的标准库实现中vector的迭代器本质就是原始指针:
- 单纯的指针地址偏移运算只要不做解引用访问,在x86平台下不会触发硬件异常,所以你能得到
end() + 1 - begin() = 11的输出 - 这只是g++的实现细节,不具备通用性,换用其他标准库实现(比如MSVC的调试模式标准库),大概率会在执行
end() + 1时直接触发越界断言终止程序。
额外纠正一个误解:C++标准从来没有规定“
vector::end()等于任何指向vector容量范围之外的迭代器”,合法的尾后迭代器只有v.end()一个,任何超出合法范围的迭代器运算都属于未定义行为,不能依赖其输出结果。
内容的提问来源于stack exchange,提问作者Antares
相关产品推荐
相关产品推荐

