Tou*_*dou 8 c++ c++20 std-ranges
为什么std::range::sort(和其他基于范围的算法)在range命名空间中实现?为什么不将其定义为std::sort范围超载?
Sto*_*ica 14
这是为了避免破坏现有的代码库。Eric Niebler、Sean Parent 和 Andrew Sutton 在他们的设计论文D4128 中讨论了不同的方法。
3.3.6 算法返回类型改为容纳哨兵
...以类似的方式,大多数算法在推广以支持哨兵时都会获得新的返回类型。在许多情况下,这是一个突破性的变化。在某些情况下,例如
for_each,更改不太可能具有破坏性。在其他情况下可能更是如此。仅仅接受破损显然是不可接受的。我们可以想象三种方法来缓解这个问题:
只有当迭代器和哨兵的类型不同时才改变返回类型。这会导致界面稍微复杂一些,可能会使用户感到困惑。它还使通用代码变得非常复杂,这需要元编程逻辑才能使用调用某些算法的结果。为此,这里不探讨这种可能性。
使算法的新返回类型可隐式转换为旧返回类型。考虑
copy,它当前返回输出迭代器的结束位置。当更改为容纳哨兵时,返回类型将更改为类似的东西pair<I, O>;,即一对输入和输出迭代器。pair我们可以返回一种可以隐式转换为其第二个参数的对,而不是返回 a 。这可以避免在某些(但不是全部)场景中出现损坏。这种诡计不太可能被完全忽视。在用户必须选择加入的单独命名空间中交付新标准库。在这种情况下,在用户明确移植他们的代码之前,不会破坏任何代码。用户将不得不适应更改后的返回类型。类似于 clang 现代化的自动升级工具在这里可以提供很大帮助。
我们,作者,更喜欢(3)。
最终,它对使用支持 C++20 的编译器进行构建的现有代码库的破坏最小。这是他们自己喜欢的方法,其余的似乎都是历史。