为什么 C++20 范围库有自己的命名空间?

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,更改不太可能具有破坏性。在其他情况下可能更是如此。仅仅接受破损显然是不可接受的。我们可以想象三种方法来缓解这个问题:

  1. 只有当迭代器和哨兵的类型不同时才改变返回类型。这会导致界面稍微复杂一些,可能会使用户感到困惑。它还使通用代码变得非常复杂,这需要元编程逻辑才能使用调用某些算法的结果。为此,这里不探讨这种可能性。

  2. 使算法的新返回类型可隐式转换为旧返回类型。考虑copy,它当前返回输出迭代器的结束位置。当更改为容纳哨兵时,返回类型将更改为类似的东西pair<I, O>;,即一对输入和输出迭代器。pair我们可以返回一种可以隐式转换为其第二个参数的对,而不是返回 a 。这可以避免在某些(但不是全部)场景中出现损坏。这种诡计不太可能被完全忽视。

  3. 在用户必须选择加入的单独命名空间中交付新标准库。在这种情况下,在用户明确移植他们的代码之前,不会破坏任何代码。用户将不得不适应更改后的返回类型。类似于 clang 现代化的自动升级工具在这里可以提供很大帮助。

我们,作者,更喜欢(3)。

最终,它对使用支持 C++20 的编译器进行构建的现有代码库的破坏最小。这是他们自己喜欢的方法,其余的似乎都是历史。

  • 什么,不喜欢“rfor_each”“rtransform”?当你可以用一些愚蠢的额外字符为所有内容添加前缀时,为什么还要使用命名空间呢?(我开玩笑) (2认同)