Ответ 1
Такой указатель не может участвовать в арифметике указателя, потенциально полезные вещи, которые еще могут быть выполнены, - это получить его тип с decltype
или reinterpret_cast
его другим типом указателя или intptr_t
. Это объясняется тем, что в разделе 3.9p6 говорится:
Тип класса (например, "
class X
" ) может быть неполным в одной точке единицы перевода и завершаться позже; тип "class X
" является одним и тем же типом в обеих точках. Объявленный тип объекта массива может быть массивом неполного типа класса и, следовательно, неполным; если тип класса будет завершен позже в блоке перевода, тип массива будет завершен; тип массива в этих двух точках является одним и тем же типом. Объявленный тип объекта массива может быть массивом неизвестного размера и поэтому быть неполным в одной точке единицы перевода и заканчиваться позже; типы массивов в этих двух точках ( "массив неизвестной границыT
" и "массив изN
T
" ) - это разные типы. Тип указателя на массив неизвестного размера или тип, определяемый объявлением typedef, как массив неизвестного размера, не может быть завершен.
5.3.1 говорит:
Примечание. Неверно указатель на указатель на неполный тип (кроме
cv
void
). Полученное таким образом lval может использоваться ограниченным образом (например, для инициализации ссылки); это значение lvalue не должно быть преобразовано в prvalue, см. 4.1.
Так как распад матрицы к указателю может выполняться по массиву lvalues без предварительного преобразования в rvalue, код dyp, оставленный в комментарии, правильный:
(*p)[i]
Соответствующее правило, от 4.2:
lvalue или rvalue массива типа
N
T
"или " массив неизвестной границыT
" можно преобразовать в значение prvalue типа" указатель наT
". Результатом является указатель на первый элемент массива.