Эмуляция 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

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