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

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



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

也有采用旧需求名称的"new"需求,例如 RandomAccessIterator ,为什么要添加这些需求?在我看来,新的变体仅是传统变体的影子,没有区别。

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

最佳答案

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

在C++ 20之前的版本中,“概念”只是标准中的一组要求,代表了某些模板参数的预期行为。在C++ 20中,由于概念已成为实际的语言功能,因此需要转变。问题是“concept”的范围RandomAccessIterator与“RandomAccessIterator”的旧式“概念”不同。

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

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

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

关于c++ - 新的迭代器要求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53970756/

10-11 15:11