【问题标题】:New iterator requirements新的迭代器要求
【发布时间】:2019-05-27 00:01:03
【问题描述】:

我注意到,如果不是所有容器,大多数容器现在都需要它们的 ::iterator 类型来满足 LegacySomethingIterator 而不是 SomethingIterator

例如std::vector<>::iteratornow requires:

iteratorLegacyRandomAccessIterator

这对于大多数其他容器来说似乎都是一样的,都要求它们的迭代器从 SomethingIterator 转到 LegacySomethingIterator

还有一些“新”需求取了旧需求的名字,比如RandomAccessIterator,为什么要加这些?在我看来,新变体只是覆盖了旧变体,没有区别。

为什么首先要创建新的,它们的要求在我看来是一样的。为什么新的要求不直接替换旧的要求,而不是现在有两个不同的名称(例如RandomAccessIteratorLegacyRandomAccessIterator)?

【问题讨论】:

标签: c++ c++-concepts c++20


【解决方案1】:

这些不是新事物,因此称为“遗产”。这只是 cppreference 站点选择调和 C++20 将有两个不同的东西的事实,这两个东西都是称为“RandomAccessIterator”的“概念”(好吧,直到 C++20 决定重命名它们的版本random_access_iterator)。

在 C++20 之前,“概念”只是标准中的一组要求,代表某些模板参数的预期行为。在 C++20 中,随着概念成为一种实际的语言特性,这需要转变。问题是“RandomAccessIterator”的范围concept 与“RandomAccessIterator”的旧式“概念”不同

由于 C++ 将它们都视为“概念”(尽管在语言意义上只有较新的概念是 concept),因此它们在 Wiki 上的页面名称将相同。而 MediaWiki 并不允许这样做。

因此,网站的维护者决定使用“旧版”来区分它们。请注意,实际的 standard 不使用此“Legacy”前缀。

请注意,C++20 标准确实为旧概念添加了前缀:“Cpp17”。所以旧概念是“Cpp17RandomAccessIterator”。由于显而易见的原因,这被认为不适合 Cppreference。

【讨论】:

  • 哈哈,真有趣。我实际上编辑了那部分。我最初的帖子有另一个问题,询问该标准是否使用术语 LegacyIterator 但后来我想它必须是因为 cppreference 总是非常符合标准。猜猜在这种情况下,谢谢:)
  • @SombreroChicken 该标准使用“Cpp17”作为前缀,但我不想将 C++98 组件记录为需要 Cpp17Thingamabob。
猜你喜欢
  • 1970-01-01
  • 2014-06-27
  • 2022-10-15
  • 2021-04-10
  • 2019-04-06
  • 2020-07-10
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多