Могу ли я Dereference std :: string.end ()?C++

Программы на C++. Форум разработчиков
Anonymous
Могу ли я Dereference std :: string.end ()?

Сообщение Anonymous »

Я считаю, что общий ответ на это-«нет», так как итератор End () для контейнеров представляет собой адрес «прошлого», который является неопределенным поведением для Dereference. Я не могу найти явное утверждение в стандарте, которое освобождает строки из этого ограничения, хотя строки имеют особый случай в других контейнерах. string [size ()] < /code> ссылки на значение только для чтения нулевого терминатора. < /p>


24.3.2.5.

Код: Выделить всё

const_reference operator[](size_type pos) const;< /code> < /p>

reference operator[](size_type pos);< /code> < /p>

(1) Requires: pos , где изменение объекта на любое значение, отличное от chart () < /code> приводит к
не определенное поведение. < /P>
< /blockquote>

[code]front()
определяется как эквивалентный для возврата оператора [] (0) , что эквивалентно возврату оператора [] (size ()) для пустой строки.

Код: Выделить всё

end() - begin()
является четко определенной как разница в длине строки, поэтому End () должен указывать на индекс size () для определения этой арифметики.

В вышеуказанном стандартном отрывке. size () . Он не говорит , что вы можете Dereference Begin () + size () , но вы думаете, разумно предположить, что это должно быть четко определен? Или, что еще лучше, знаете ли вы о каком -то доказательстве, которое освобождают итераторы строк из ограничения?>

Подробнее здесь: https://stackoverflow.com/questions/616 ... string-end

Вернуться в «C++»