我注意到,即使不是全部,大多数容器现在都需要其::iterator
类型来满足LegacySomethingIterator
而不是SomethingIterator
的要求。
例如std::vector<>::iterator
now requires:
iterator
LegacyRandomAccessIterator
对于大多数其他容器,这似乎是相同的,所有这些容器都要求其迭代器从SomethingIterator
到LegacySomethingIterator
。
还有一些“新”要求采用了旧要求的名称,例如RandomAccessIterator
,为什么要添加这些要求?在我看来,新的变体只会掩盖旧的变体,没有区别。
为什么首先要创建新的,对我来说它们的要求是相同的。为什么新的不只是替换旧的要求,而不是立即为它们提供两个不同的名称(例如RandomAccessIterator
和LegacyRandomAccessIterator
)?
答案 0 :(得分:24)
这些不是新事物,因此是“传统”一词。这就是cppreference站点选择如何调和C ++ 20将具有两个不同的东西的事实,它们都是“概念”,称为“ RandomAccessIterator”。
Pre-C ++ 20中,“概念”只是标准中的一组要求,代表了某些模板参数的预期行为。在C ++ 20中,随着概念成为实际的语言功能,这一点需要转变。问题是“ concept
”的范围RandomAccessIterator
与“ RandomAccessIterator”的旧式“概念” 不相同。
由于C ++认为它们都是“概念”(尽管只有较新的一个在语言意义上是concept
),因此它们在Wiki上都具有相同的页面名称。而且MediaWiki真的不允许这样做。
因此,该站点的维护者决定使用“旧版”来区分它们。请注意,实际的 standard 并不使用此“旧版”前缀。
请注意,C ++ 20标准确实具有较早概念的前缀:“ Cpp17”。因此,旧概念将是“ Cpp17RandomAccessIterator”。出于明显的原因,这不适合Cppreference使用。