Соглашением для диапазонов является [inclusive, exclusive)
, то есть, если вы выполняете итерацию по диапазону [X,Y)
, вы концептуально выполните следующее (псевдокод):
for( iterator ii = X; ii != Y; ++ii) {
...
}
Это позволяет выразить пустой диапазон как [X,X)
. Кроме того, этот пустой диапазон отлично определен для каждого адреса, независимо от того, является ли он действительным или недействительным.
При этом требования к data()
(внимание мое):
23.3.6.4 [vector.data]
T * data () noexcept;
const T * data () const noexcept;
Возвраты: указатель, для которого [data (), data () + size ()) является допустимым диапазоном. Для непустого вектора data () == & amp; front ().
blockquote>Мне кажется, что единственная безусловная гарантия заключается в том, что
[data(),data() + size())
должен быть допустимым диапазоном. Для функцииsize() == 0
функция-членdata()
может возвращать любое значение, и диапазон будет действительным пустым диапазоном. Поэтому я бы сказал, что реализации разрешено возвращать ненулевой указатель, еслиsize()
равно нулю .