Могу ли я 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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