Существует ли формальный список требований для пользовательских итераторов? - PullRequest
1 голос
/ 30 марта 2020

Мне интересно использовать синтаксис итератора для других типов итераций; в частности, не над контейнером, а просто для очистки кода, который функционирует как итерация.

У меня уже есть кое-что работающее (и, возможно, - если оно не сломано, не исправить?), но я хотел бы знать формальные требования к итератору для всех случаев (т. е. различные типы итераторов, такие как константа, и их категории / теги, например, вперед).

Вот что как я понимаю реализацию из cppreference

{
    auto && __range = /* range_expression */;
    auto __begin = __range.begin( );
    auto __end = __range.end( );
    for ( ;
          __begin != __end;
          ++__begin )
    {
        /* range_declaration */ = *__begin;
        /* loop_statement */
    }
}

Из того, что я собрал, текущие требования:

  1. __range должен содержать не -stati c Доступный по rvalue элемент функции с именами begin и end, которые не принимают параметров
  2. Возврат из begin должен поддерживать оператор предварительного увеличения
  3. Возврат из begin должен поддерживать оператор разыменования
  4. Возвращает begin и end должен поддерживать оператор не равно

Но потом я смотрю на стандарт и вижу вещи как const_iterator и все псевдонимы-члены типа итератора, возвращенные из begin и end, но я никогда не видел, чтобы они использовались (за исключением чего-то вроде функций алгоритми c, в этом случае формальных требований не существует, кроме конца -кодер, и не являются фактическими требованиями для кого-то, делающего свой собственный итератор).

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Нет никаких договорных требований для объекта, который будет использоваться с диапазоном для l oop. В отличие от стандартных библиотечных функций, язык точно определяет , как переписывается l oop (с небольшими обновлениями для разных языковых версий), и это означает, что означает эта замена (в том числе плохо сформированная). Обратите внимание, что есть другие возможности, кроме тех, которые вы упомянули, например, begin и end, найденные ADL.

0 голосов
/ 30 марта 2020

за исключением чего-то вроде алгоритмических c функций, в этом случае формальные требования отсутствуют, кроме конечного кодера, и не являются фактическими требованиями для того, кто создает свой собственный итератор

Что вы подразумеваете под этим?

Если вы хотите вызвать функцию, которая принимает BidirectionalIterator , вы должны выполнить все требования. Вы не можете выбирать, какие и игнорировать некоторые, если только вы не хотите, чтобы ваш код ломался при смене версий.

Если вы имеете в виду, что вы ничего не видите, используя std::iterator_traits<T>::reference, это может быть потому, что теперь мы have decltype & auto.

const_iterator - это итератор, который вы получаете из диапазона const, который дает только const доступ к элементам.

...