Если 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));
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ement-well
Мобильная версия