C++20非range标准算法沿用旧迭代器要求还是匹配concept约束?
结论
C20标准中,C20之前就存在的非std::ranges版本标准算法,仍然沿用旧版的迭代器具名要求,没有放宽到匹配对应concept的要求。
核心依据
- 向后兼容性要求:大量存量代码依赖旧迭代器具名要求的隐含特性,比如前向迭代器解引用返回左值、输入迭代器支持相等比较等,如果直接放宽算法的迭代器要求,会导致原本合法的代码出现未定义行为。
- 标准文本明确规定:非range版本的旧算法没有修改迭代器相关的前置条件,也没有新增concept作为参数约束,只有新增的
std::ranges系列算法才采用了更宽松的concept校验逻辑。
注意事项
由于旧版非range算法没有C++20 concept的编译期校验,即使你传入仅满足对应concept、不满足旧具名要求的迭代器,大概率也能正常编译,但这属于违反算法前置条件的操作,实际运行会触发未定义行为。
如果需要适配更宽松的迭代器类型,直接调用std::ranges下的同名算法即可。
内容的提问来源于stack exchange,提问作者HolyBlackCat
相关产品推荐
相关产品推荐

