Являются ли супер-SCARY-итераторы законными? - программирование

Являются ли супер-SCARY-итераторы законными?

Я понимаю, что стандарт позволяет std::vector<int, A> иметь одинаковые типы итераторов для разных распределителей A. Это называется ИССЛЕДОВАНИЯ SCARY.

Теперь вопрос заключается в том, разрешает ли стандарт std::vector<int, A>::iterator просто typedef из A::pointer, что делает его просто int* для распределителя по умолчанию?

Или существует ли какое-либо (неявное) требование, чтобы он был отдельным типом класса для контейнера? Если такого требования нет, то почему все основные реализации (в том числе SCARY) не используют этот подход? Вероятно, это уменьшит работу компилятора еще больше, хотя теперь код, который перегружается на int* и vector<>::iterator, не будет компилироваться.

4b9b3361

Ответ 1

Re

", стандарт позволяет std::vector<int, A>::iterator быть просто typedef из A::pointer

Насколько я знаю, да. Но не std::vector<bool, A>, потому что специализация, где разыменованный итератор - это прокси-объект, который обращается к любому представлению, с целью поддержки одного бита на bool.

Ответ 2

Теперь вопрос заключается в том, разрешает ли стандарт std::vector<int, A>::iterator просто typedef A::pointer, что делает его просто int* для распределителя по умолчанию?

Я думаю, что не для какой-либо реализации.

24.2 Требования к итератору [iterator.requirements]

24.2.1 В целом [iterator.requirements.general]

11 В следующих разделах a и b обозначают значения типа X или const X, [...]

24.2.7 Итераторы произвольного доступа [random.access.iterators]

Expression | Return type    | Operational | Assertion/note
           |                | semantics   | pre-/post-condition
-----------+----------------+-------------+--------------------------------
[...]
-----------+----------------+-------------+--------------------------------
a < b      | contextually   | b - a > 0   | < is a total ordering relation
           | convertible to |             |
           | bool           |             |

Обратите внимание, что в отличие от предыдущего требования на - для < нет предпосылки, что a и b являются итераторами одного и того же контейнера. < требуется для формирования полного отношения упорядочения для любых итераторов. < не требуется формировать полное отношение упорядочения для произвольных указателей. Хотя реализациям разрешено расширять определение < для типов необработанных указателей, чтобы позволить сравнивать несвязанные значения указателя, популярные текущие реалии реального мира не делают этого, потому что такое расширение предотвратит некоторые возможности оптимизации.