新的迭代器要求
New iterator requirements
我注意到大多数(如果不是全部)容器现在需要它们的 ::iterator
类型来满足 LegacySomethingIterator
而不是 SomethingIterator
。
例如,std::vector<>::iterator
now requires:
iterator
LegacyRandomAccessIterator
大多数其他容器似乎都一样,都需要它们的迭代器从 SomethingIterator
到 LegacySomethingIterator
。
还有"new"需求是用了旧需求的名称,比如RandomAccessIterator
,为什么要加这些呢?在我看来,新变体只是掩盖了遗留变体,没有区别。
为什么一开始就创建了新的,他们的要求在我看来是一样的。为什么新的不直接替换旧的要求,而是现在为它们取两个不同的名称(例如 RandomAccessIterator
和 LegacyRandomAccessIterator
)?
这些都不是新事物,因此术语 "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。
我注意到大多数(如果不是全部)容器现在需要它们的 ::iterator
类型来满足 LegacySomethingIterator
而不是 SomethingIterator
。
例如,std::vector<>::iterator
now requires:
iterator
LegacyRandomAccessIterator
大多数其他容器似乎都一样,都需要它们的迭代器从 SomethingIterator
到 LegacySomethingIterator
。
还有"new"需求是用了旧需求的名称,比如RandomAccessIterator
,为什么要加这些呢?在我看来,新变体只是掩盖了遗留变体,没有区别。
为什么一开始就创建了新的,他们的要求在我看来是一样的。为什么新的不直接替换旧的要求,而是现在为它们取两个不同的名称(例如 RandomAccessIterator
和 LegacyRandomAccessIterator
)?
这些都不是新事物,因此术语 "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。