Ответ 1
Объект массива и его первый элемент не являются взаимно конвертируемыми с указателем * поэтому результат reinterpret_cast
является указателем типа "указатель на массив из 8 int
", значение которого является "указателем на a[0]
" 1. Другими словами, несмотря на тип, он фактически не указывает на какой-либо объект массива.
Затем код применяет преобразование массива к указателю в значение l, которое было результатом разыменования такого указателя (как часть выражения индексации (*p)[0]
) 2. Это поведение конверсии указывается только тогда, когда значение lvalue фактически ссылается на объект массива 3. Так как lvalue в этом случае нет, поведение не определено отсутствием 4.
* Если возникает вопрос: "Почему объект массива и его первый элемент не являются взаимопереключателями?", Уже задан вопрос: взаимная конвертация указателя с тем же адресом.
1 См. [Expr.reinterpret.cast]/7, [conv.ptr]/2, [expr.static.cast]/13 и [basic.compound]/4.
2 См. [Basic.lval]/6, [expr.sub] и [expr.add].
3[conv.array]: "Результат - это указатель на первый элемент массива ".
4[defns.undefined]: неопределенное поведение - это "поведение, для которого этот документ не предъявляет никаких требований", в том числе "когда этот документ не содержит явного определения поведения".