Новые требования к итераторам - программирование
Подтвердить что ты не робот

Новые требования к итераторам

Я заметил, что большинству, если не всем контейнерам, теперь требуется тип ::iterator для соответствия LegacySomethingIterator вместо SomethingIterator.

Например, std::vector<>::iterator теперь требует:

iterator LegacyRandomAccessIterator

Это похоже на то же самое для большинства других контейнеров, и все они требуют, чтобы их итераторы LegacySomethingIterator от SomethingIterator к LegacySomethingIterator.

Существуют также "новые" требования, которые называются старыми требованиями, например RandomAccessIterator, почему они были добавлены? Мне кажется, что новые варианты просто затеняют унаследованные варианты, никаких отличий.

Почему новые были созданы в первую очередь, их требования выглядят одинаково для меня. Почему новые просто не заменяют старые требования вместо того, чтобы прямо сейчас иметь 2 разных имени для них (например, RandomAccessIterator и LegacyRandomAccessIterator)?

4b9b3361

Ответ 1

Это не новые вещи, отсюда и термин "наследие". Это просто то, как сайт cppreference выбирает, чтобы согласовать тот факт, что C++ 20 будет иметь две разные вещи, которые являются "концепциями", называемыми "RandomAccessIterator".

До C++ 20 "концепция" была просто набором требований в стандарте, которые представляли поведение, ожидаемое от определенных параметров шаблона. В C++ 20, когда концепции становятся фактической особенностью языка, это необходимо изменить. Проблема заключается в том, что concept " RandomAccessIterator " в Ranges не совпадает с концепцией "в раннем стиле" "RandomAccessIterator".

Поскольку C++ считает, что оба они являются "концептами" (хотя только более новый является concept в языковом смысле), они оба будут иметь одно и то же имя страницы в вики. И MediaWiki действительно не позволяет этого.

Поэтому разработчики сайта решили использовать "Legacy" для их дифференциации. Обратите внимание, что фактический стандарт не использует этот префикс "Legacy".

Обратите внимание, что стандарт C++ 20 имеет префикс для более старых понятий: "Cpp17". Таким образом, старая концепция будет "Cpp17RandomAccessIterator". Это не было сочтено целесообразным для Cppreference по очевидным причинам.