Какая польза от типа вложенного указателя в 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
"soperator->
а такжеoperator[]
не указаны явно Вместо этого эти типы описываются с точки зрения набора требований, которые должны удовлетворятьсяiterator_facade
реализация.
Вывод: пока прокси-итератор не требует доступа к членам своего базового value_type
через .m
или же ->m
не нужно беспокоиться о pointer
введите внутри iterator_traits
и даже если кто-то использует прокси-итераторы, boost::iterator_facade
будет делать правильные вещи.