C++20中为何非范围版STL算法未采用概念约束?
为什么std::sort等非范围版STL算法不使用概念约束?
先对比两个sort接口的声明:
std::ranges::sort(C++20范围版)
template< std::random_access_iterator I, std::sentinel_for<I> S, class Comp = ranges::less, class Proj = std::identity > requires std::sortable<I, Comp, Proj> constexpr I sort( I first, S last, Comp comp = {}, Proj proj = {} );
std::sort(传统非范围版)
template< class RandomIt > void sort( RandomIt first, RandomIt last );
非范围版STL算法不采用概念约束的核心原因如下:
向后兼容性绝对优先:传统STL算法是C++98就确立的接口,全球无数现有代码依赖它们的行为。如果给这些旧模板加上概念约束,会打破原有的SFINAE逻辑——概念约束的检查是“硬错误”,而旧代码很多依赖模板参数不满足时的软失败(SFINAE)来选择其他重载,直接加概念会导致大量旧代码编译失败。
新旧接口的分层设计:C20引入的范围库(
std::ranges)是全新的迭代器/算法体系,概念特性是专门为这套新体系设计的。标准委员会的策略是让旧接口保持原样,新接口利用C20的新特性优化体验,避免新旧特性混合带来的混乱。旧接口的隐式契约已固化:传统算法的迭代器要求(比如
std::sort需要随机访问迭代器)已经通过文档和多年实践形成了隐式契约,开发者早已熟悉这种“约定大于显式约束”的模式。修改旧接口添加概念约束,除了破坏兼容性,并没有带来足够的收益。
相关问题:std::fill_n与std::ranges::fill_n有何区别?
内容的提问来源于stack exchange,提问作者NemoYuan2008
相关产品推荐
相关产品推荐

