Эмуляция std::start_lifetime_as_array в C++20C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Эмуляция std::start_lifetime_as_array в C++20

Сообщение Anonymous »

Согласно cppreference, ни один компилятор в настоящее время не поддерживает std::start_lifetime_as_array.
Однако ответ SO предполагает, что его можно «эмулировать» в C++20 как следует:

Код: Выделить всё

template
requires (std::is_trivially_copyable_v && std::is_implicit_lifetime_v)
T* start_lifetime_as(void* p) noexcept
{
return std::launder(static_cast(std::memmove(p, p, sizeof(T))));
}
Как мы можем аналогичным образом эмулировать std::start_lifetime_as_array, не вызывая неопределенного поведения?
cppreference говорит об этом

Код: Выделить всё

template< class T >
T* start_lifetime_as_array( void* p, std::size_t n ) noexcept;
Неявно создает массив с типом элемента T и длиной n. Точнее, если n > 0 истинно, это эквивалентно std::start_lifetime_as(p), где U — это тип «массив из n T».< /p>

Но n известен только во время выполнения.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ray-in-c20
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»