Четко ли определена арифметика указателя, указывающего на уничтоженный элемент массива?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Четко ли определена арифметика указателя, указывающего на уничтоженный элемент массива?

Сообщение Anonymous »

В Cppreference правила арифметики указателей включают в себя:

Если P указывает на i-й элемент объекта массива x с n элементами, учитывая значение J как j, P добавляется или вычитается как следующее:
– P + J и J + P указывают на i + j-й элемент x, если 0 ≤ i + j < n, и являются указателями за концом последнего элемента x, если i + j == n.
– В противном случае поведение undefined.
(…нерелевантные случаи опущены…)
Для сложения и вычитания, если P (или Q) имеет тип «указатель на T», где T и тип элемента массива не похожи, поведение не определено.

Как сказано там, кажется, что арифметика указателей, такая как ptr + 1 / ptr++, четко определена, только если ptr указывает на элемент массива (или элемент за концом того же массива). Что, если указанный элемент массива уже был уничтожен до выполнения арифметических действий?
На практике это часто работает, но по стандарту мне интересно, является ли это неопределенным поведением (UB). Я спрашиваю только об арифметическом шаге (перемещение указателя), а не о последующем доступе к уничтоженному объекту. Например:

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

template
constexpr // since C++20
void destroy(ForwardIt first, ForwardIt last)
{
for (; first != last; ++first)
std::destroy_at(std::addressof(*first));
}
Это возможная реализация std::destroy в Cppreference, но ++first происходит после того, как указанный объект был уничтожен (его время жизни закончилось). Является ли эта арифметика указателя четко определенным или неопределенным поведением (UB)?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ement-well
Ответить

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

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

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

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

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