【问题标题】:Why does the C++20 range library have its own namespace?为什么 C++20 范围库有自己的命名空间?
【发布时间】:2021-02-07 13:58:25
【问题描述】:

为什么在range 命名空间中实现std::range::sort(和其他基于范围的算法)?为什么不将其定义为std::sort 的重载占用范围?

【问题讨论】:

  • 我的猜测是,这是为了避免使对重载分辨率的控制成为库规范和实现者的噩梦。
  • @StoryTeller-UnslanderMonica 他们不能用概念来解决这个问题吗?
  • 他们需要检查每个现有的重载并更新从重载集中删除它的条件。不管有没有概念,要确保它的行为正确,仍然需要做很多工作。我怀疑 C++20 是否会支持范围,如果他们走那条路的话。
  • 这可能是一个潜在的重大变化吗?允许std::sort(range, compare) 可能会改变现有代码中std::sort(begin, end) 的含义。
  • @cigien 如果某个东西同时是一个有效的比较器和一个有效的迭代器怎么办? :P 这不太可能,但可能是这样。

标签: c++ c++20 std-ranges


【解决方案1】:

这是为了避免破坏现有的代码库。 Eric Niebler、Sean Parent 和 Andrew Sutton 在他们的设计论文 D4128 中讨论了不同的方法。

3.3.6 更改算法返回类型以适应哨兵

... 以类似的方式,大多数算法在它们获得新的返回类型时 被推广到支持哨兵。这是一个破坏源的变化 在很多情况下。在某些情况下,例如for_each,更改不太可能 非常具有破坏性。在其他情况下,情况可能更是如此。只是接受 破损显然是不可接受的。我们可以想象三种方式 缓解问题:

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

  2. 使算法的新返回类型隐式转换为旧返回类型。考虑copy,它当前返回 输出迭代器的结束位置。当改变以适应 哨兵,返回类型将更改为pair<I, O>; 之类的东西,即一对输入和输出迭代器。代替 返回一个pair,我们可以返回一种隐含的对 可转换为它的第二个参数。这避免了一些破损,但 不是全部,场景。这种诡计不太可能完全消失 不被注意。

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

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

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

【讨论】:

  • 我没有考虑需要同时容纳新旧代码的返回类型。有道理,谢谢。
  • 什么,不喜欢rfor_each rtransform?当你可以用一些愚蠢的额外字符作为前缀时,为什么要使用命名空间呢? (我的孩子)
  • rrbegin() 听起来不错 ^^
猜你喜欢
  • 2012-11-06
  • 2022-07-06
  • 2010-12-02
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多