Принимая во внимание весь стандарт С++ 11, возможно ли, что любая соответствующая реализация преуспеет в первом утверждении ниже, но не имеет последнего?
#include <cassert>
int main(int, char**)
{
const int I = 5, J = 4, K = 3;
const int N = I * J * K;
int arr1d[N] = {0};
int (&arr3d)[I][J][K] = reinterpret_cast<int (&)[I][J][K]>(arr1d);
assert(static_cast<void*>(arr1d) ==
static_cast<void*>(arr3d)); // is this necessary?
arr3d[3][2][1] = 1;
assert(arr1d[3 * (J * K) + 2 * K + 1] == 1); // UB?
}
Если нет, это технически UB или нет, и этот ответ меняется, если первое утверждение удалено (есть reinterpret_cast
, чтобы сохранить здесь адреса?)? Кроме того, что, если преобразование выполняется в противоположном направлении (от 3d до 1d) или от массива 6x35 до массива 10x21?
EDIT:. Если ответ заключается в том, что это UB из-за reinterpret_cast
, существует ли какой-то другой строго совместимый способ перестройки (например, через static_cast
в/из промежуточного void *
)?