Для концепций Range TS и С++ 20 для итераторов требуется возможность использовать "operator->"?

Я просматривал различные предложения Range TS, в том числе P0896, один из которых включает диапазоны в С++ 20. По моему мнению, единственное требование, которое концепция Iterator делает в терминах разыменования, состоит в том, что *t является допустимым синтаксисом, который дает объект некоторого типа.

Поскольку InputIterator определяется как Iterator и является Readable, ни одна из которых не требует поддержки operator->, похоже, что TS и С++ 20 не требуют, чтобы итераторы предоставляли -> поддержку.

Это так?

Ответ 1

Да, мы отбросили требование operator-> от InputIterator и, следовательно, итераторы, которые его усовершенствовали. (Требование остается частью требований "старого" ввода-итератора, которые не изменяются.) Существует ряд причин:

  1. Не существует способа реализовать -> для многих типов итераторов, так что семантика i->m эквивалентна (*i).m как (*i).m "старые" требования. move_iterator - хороший пример: (*i).m является rvalue, тогда как i->m является lvalue. (Да, это еще один стандартный итератор, который не удовлетворяет требованиям итератора.)
  2. Нет никакого способа с пользой ограничить -> понятиями. Конечно, мы могли бы потребовать, чтобы был operator->, но мы не могли ограничить его разумным синтаксисом.
  3. Самое главное, -> бесполезно для стандартных алгоритмов: они понятия не имеют, имеют ли элементы, обозначенные итератором, члены, не говоря уже о том, как назвать таких членов.

Это не означает, что стандартные итераторы не будут предоставлять operator-> (хотя см. LWG 2790), только для итераторов не требуется использовать такой оператор для использования в стандартной библиотеке.