рабочий проект стандарта N4659 гласит:
[basic.compound]
Если два объекта являются взаимно конвертируемыми, то они имеют один и тот же адрес
а затем отмечает, что
Объект массива и его первый элемент не являются взаимопереключателями, хотя они имеют один и тот же адрес
В чем обоснование для создания объекта массива и его первого элемента, не являющегося указателем-взаимообратимым? В более общем плане, в чем смысл разграничения понятия указатель-интерконвертируемости от понятия того же адреса? Разве там нет противоречия?
Казалось бы, учитывая эту последовательность утверждений
int a[10];
void* p1 = static_cast<void*>(&a[0]);
void* p2 = static_cast<void*>(&a);
int* i1 = static_cast<int*>(p1);
int* i2 = static_cast<int*>(p2);
имеем p1 == p2
, однако i1
корректно определен, и использование i2
приведет к UB.