Какая польза от типа вложенного указателя в iterator_traits?

std::iterator_traits Шаблон класса определяет 5 вложенных типов: iterator_category, value_type, difference_type, pointer а также reference, Просмотр источников <algorithm> заголовок обоих libC++ и libstdC++, можно увидеть множество применений value_type, difference_type а также iterator_category, но только один для reference (внутри std::iter_swap) и ни для pointer,

Мое приложение использует созданную вручную пару итератор / прокси-сервер. Я хочу перейти на использование Boost iterator_facade который позволяет мне настроить тип ссылки по умолчанию T& к произвольному типу, но не так для типа указателя, который T* по умолчанию. Я хочу избежать укусов глубоко скрытого использования вложенных pointer тип.

Примечание: итератор является прокси для встроенного типа без вложенных членов, поэтому мне не нужна совместимость с operator-> (для которого тип возврата будет pointer).

Вопрос: какие варианты использования есть в стандартной библиотеке для вложенного типа pointer внутри iterator_traits?

1 ответ

Решение

В отличие от первых трех типов iterator_category, value_type а также difference_type (которые широко используются стандартными алгоритмами для отправки тегов в эффективные версии в зависимости от возможностей итератора) последние два типа pointer а также reference внутри iterator_traits похоже, не используются никакими алгоритмами, но используются для определения соответствия требованиям итератора.

24.2.1 В общем [iterator.requirements.general]

1 [..] Все итераторы i для которого выражение (*i).m хорошо определены, поддерживают выражение i->m с той же семантикой, что и (*i).m, [...]

24.4.1 Черты итератора [iterator.traits]

[...] Кроме того, типы

 iterator_traits<Iterator>::reference
 iterator_traits<Iterator>::pointer 

должен быть определен как тип ссылки и указатель итератора, то есть для объекта итератора aтот же тип, что и тип *a а также a->соответственно. [...]

Значения по умолчанию T* а также T& за pointer а также reference конечно, удовлетворить требования итератора. Что касается ссылок на прокси, в документации Boost.Iterator указывается

reference Тип читаемого итератора (и сегодняшний входной итератор) на самом деле не обязательно должен быть ссылкой, если он может быть преобразован в итератор. value_type, Когда value_type это класс, однако, все еще должна быть возможность доступа к членам через operator->, Поэтому итератор которого reference Тип на самом деле ссылка не должна возвращать прокси, содержащий копию ссылочного значения из его operator->,

Типы возврата для iterator_facade"s operator-> а также operator[] не указаны явно Вместо этого эти типы описываются с точки зрения набора требований, которые должны удовлетворяться iterator_facade реализация.

Вывод: пока прокси-итератор не требует доступа к членам своего базового value_type через .m или же ->mне нужно беспокоиться о pointer введите внутри iterator_traitsи даже если кто-то использует прокси-итераторы, boost::iterator_facade будет делать правильные вещи.

Другие вопросы по тегам