Отвечая на вопрос «Диапазон на основе цикла для массивов, выделенных кучей» сегодня, я наткнулся на предложение использовать reinterpret_cast для приведения типа указателя к типу массива с использованием std::launder (после некоторого обсуждения мы решили опубликовать новый вопрос, так как не смогли найти вывода.) . Приведение было выполнено следующим образом (скажем, например, чтобы иметь возможность использовать циклы на основе диапазона для итерации по массиву):
int* ptr = new int[3];
auto arr_ptr = std::launder(reinterpret_cast<int (*)[3]>(ptr));
Я почти уверен, что это UB, но не совсем уверен. Есть ли у кого-нибудь достаточно твердые в C++, чтобы ответить на этот вопрос?
Я думаю, это сводится к вопросу, действителен ли reinterpret_cast при преобразовании от типа ptr к типу массива, который, как мне кажется, является UB, и не имеет никакого отношения к тому, использую ли я std::launder.
@ JohannesSchaub-litb Ты потерял меня;). Как бы помог new int[1][3].
Пожалуйста, не обращайте внимания на мой комментарий относительно отмывания. Видя примеры на cppreference о отмывке, я понимаю, что не имел представления об ограничениях его приложений.
потому что ему не нужен гипс
Где-то есть обман. Достаточно сказать, что этот фрагмент хорошо сформирован, но в нем есть удивительное количество нюансов.
Думаю, это правильно! Спасибо, что разъяснили мне это!





Насколько я понимаю отмывку (а понимание не очень хорошее), она четко определена. Но почему бы не сделать
new int[1][3]?