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