传入std::mismatch的两个区间长度不同是否会触发未定义行为?
关于std::mismatch调用未定义行为的问题解答
你给出的三个参数版本std::mismatch调用确实属于未定义行为,相关说明如下:
- 三个参数版本的
std::mismatch在标准中明确规定了调用前置条件:第二个序列的长度必须至少和第一个序列相等,这个校验责任由调用方承担,标准实现不需要额外处理第二个序列越界的情况,你给出的示例代码违反了该前置条件,所以触发UB是符合预期的。 - 你看到的三参数版本实现完全符合标准要求,不做第二个序列的末尾校验是为了避免不必要的性能开销,符合C++零开销抽象的设计原则。
- 你提到的带第二个序列尾迭代器的四参数版本是C++14新增的重载,该版本没有序列长度的前置要求,会同时遍历到任意一个序列结束为止,是你场景下更安全的选择。
- 你的示例代码改为四参数版本即可避免UB:
std::vector<int> v1{24, 10, 81, 7, 57}; std::vector<int> v2{24, 10, 81}; auto p = std::mismatch(v1.cbegin(), v1.cend(), v2.cbegin(), v2.cend());
该调用返回的pair中,first指向v1的第4个元素(值为7),second指向v2的尾后迭代器,行为完全确定。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

