Это разрешено, поведение определено, и оба значения begin
и end
являются безопасными значениями указателя .
В стандартном разделе C ++ 5.7 ([expr.add]
) параграф 4:
Для целей этих операторов указатель на объект без массива ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта в качестве его типа элемента.
При использовании C аналогичное предложение можно найти в стандартном разделе 6.5.6 раздела C99 / N1256, пункт 7.
Для целей этих операторов указатель на объект, который не является элементом массива, ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта в качестве его тип элемента.
Кроме того, в разделе 3.7.4.3 ([basic.stc.dynamic.safety]
) "Безопасно полученные указатели" есть сноска:
Этот раздел не накладывает ограничений на разыменование указателей на память, не выделенную ::operator new
. Это поддерживает способность многих реализаций C ++ использовать двоичные библиотеки и компоненты, написанные на других языках. В частности, это относится к двоичным файлам C, поскольку разыменование указателей на память, выделенную с помощью malloc
, не ограничено.
Это говорит о том, что арифметика указателей по всему стеку является поведением, определяемым реализацией, а не неопределенным поведением.