新的迭代器要求

New iterator requirements

我注意到大多数(如果不是全部)容器现在需要它们的 ::iterator 类型来满足 LegacySomethingIterator 而不是 SomethingIterator

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

iterator LegacyRandomAccessIterator

大多数其他容器似乎都一样,都需要它们的迭代器从 SomethingIteratorLegacySomethingIterator

还有"new"需求是用了旧需求的名称,比如RandomAccessIterator,为什么要加这些呢?在我看来,新变体只是掩盖了遗留变体,没有区别。

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

这些都不是新事物,因此术语 "legacy"。这就是 cppreference 站点选择如何调和 C++20 将有两个不同的东西的事实,这两个东西都被称为 "concepts" "RandomAccessIterator"(好吧,直到 C++20 决定重命名他们的版本 random_access_iterator).

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

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

因此网站的维护者决定使用 "Legacy" 来区分它们。请注意,实际的 标准 不使用此 "Legacy" 前缀。

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