Принудительное затухание массива (из-за отсутствия лучшего заголовка) - PullRequest
4 голосов
/ 16 апреля 2020

Вдохновлен этим вопросом: Как * (& arr + 1) - arr дает длину в элементах массива arr?

Следующий код вычислит длину массива, хотя и вызывает неопределенное поведение:

int  arr[] = {5, 8, 1, 3, 6};
size_t len = *(&arr + 1) - &arr[0]; // len is 5

Я считаю, что разыменовывая (& arr + 1), мы запускаем неопределенное поведение. Однако единственная причина, по которой мы это делаем, состоит в том, чтобы немедленно преобразовать результат в int*, указывая на один элемент после последнего в исходном массиве. Поскольку мы не разыменовываем этот указатель, мы находимся в определенной зоне.

Вопрос, таким образом, следующий: есть ли способ разложить в int*, не разыменовывая указатель, не содержащий ссылки, и оставаясь определенным?

PS Обязательный отказ от ответственности: да, я могу рассчитать размер массива с помощью оператора sizeof и деления. Это не суть вопроса.

РЕДАКТИРОВАТЬ: Теперь я менее уверен, что само косвенное указание не определено. Я обнаружил http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 и, судя по всему, была попытка легализовать косвенное обращение как таковое, но я не смог найти никакой формулировки на этот счет в действующем стандарте.

...