Angew made a comment, что vector
с использованием необработанного указателя, так как это тип итератора. Это меня бросило в петлю.Использует ли указатель в качестве контейнера Итератор Нарушает стандарт
Я начал исследовать его и обнаружили, что требование vector
итераторов было только то, что они "Random Access Iterators", для которых явно указано, что указатели квалифицироваться:
указатель на элемент массива удовлетворяет всем требованиям
Это единственная причина, по которой компиляторы даже предоставляют итераторы для vector
для целей отладки, или есть ли на самом деле требование, которое я пропустил на vector
?
Скорее всего, для согласованности с остальной частью стандартной библиотеки. 'template void doStuff (const Container & c) {for (Container :: iterator i = c.begin(); i! = c.end(); ++ i) {...}}' Шаблон например, это не волнует, какой тип контейнера вы используете, если он предоставляет «итератор», «начало» и «конец». –
0x5453
@ 0x5453 Я не понимаю, что вы говорите? Очевидно, контейнер должен возвращать итераторы. Я просто не думал, что возвращение исходных указателей было разумным. Вы обращаетесь к этому утверждению или что-то еще? –
Сложная часть - это пространственные пространства, связанные с ADL: std :: vector :: iterator'. Указатели не имеют 'std' в качестве ассоциированного пространства имен. Стандарт не требует, чтобы итераторы имели 'std' как ассоциированное пространство имен. –
MSalters