В выражении
p = p2
мы выполняем неявное преобразование встроенных типов, для которых в стандарте не описаны правила преобразования. То есть такое преобразование не гарантировано, но может быть реализовано компилятором,
например
#include <type_traits>
using namespace std;
int main() {
static_assert(std::is_convertible<int(*)[2], int(*)[]>::value, "Non-convertible");
return 0;
}
компилируется в gcc 12.2, в clang 15.0 - ошибка.
Существует старое не принятое
предложение о закреплении такого преобразования стандартом.