Нужны ли концепции Range TS и C ++ 20 для итераторов возможность использования `operator->`? - PullRequest
0 голосов
/ 29 июня 2018

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

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

Так ли это?

1 Ответ

0 голосов
/ 29 июня 2018

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

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

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

...