新的迭代器要求

时间:2018-12-29 15:15:54

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

我注意到,即使不是全部,大多数容器现在都需要其::iterator类型来满足LegacySomethingIterator而不是SomethingIterator的要求。

例如std::vector<>::iterator now requires

  

iterator LegacyRandomAccessIterator

对于大多数其他容器,这似乎是相同的,所有这些容器都要求其迭代器从SomethingIteratorLegacySomethingIterator

还有一些“新”要求采用了旧要求的名称,例如RandomAccessIterator,为什么要添加这些要求?在我看来,新的变体只会掩盖旧的变体,没有区别。

为什么首先要创建新的,对我来说它们的要求是相同的。为什么新的不只是替换旧的要求,而不是立即为它们提供两个不同的名称(例如RandomAccessIteratorLegacyRandomAccessIterator)?

1 个答案:

答案 0 :(得分:24)

这些不是新事物,因此是“传统”一词。这就是cppreference站点选择如何调和C ++ 20将具有两个不同的东西的事实,它们都是“概念”,称为“ RandomAccessIterator”。

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

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

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

请注意,C ++ 20标准确实具有较早概念的前缀:“ Cpp17”。因此,旧概念将是“ Cpp17RandomAccessIterator”。出于明显的原因,这不适合Cppreference使用。