C++20 удалил construct() и destruct() из std::allocator. Как я должен строить свои объекты, выделенные через std::allocator<T>::allocate()? Я нашел std::uninitialized_fill() и std::uninitialized_copy(), но, насколько я понял, они не поддерживают аллокатор, и делают копии, что, как мне кажется, сильно снизит производительность для не-POD типов.

Guess

Ответов: 2

Ответы (2)

Вы можете сделать это с помощью std::allocator_traits.

Смысл удаления метода construct заключается в том, что трейты аллокатора уже имеют этот метод, а контейнеры STL все равно используют std::allocator_traits::construct.

Документация в cppreference

А вот небольшой пример: (Alloc - любой аллокатор)

Alloc a{};
std::allocator_traits<Alloc>::pointer i = std::allocator_traits<Alloc>::allocate(a, allocated_size);

// You use the construct and destroy methods from the allocator traits
std::allocator_traits<Alloc>::construct(a, i, value_to_construt);
std::allocator_traits<Alloc>::destroy(a, i);

std::allocator_traits<Alloc>::deallocate(a, i, allocated_size);

Похоже, что статическая форма construct все еще существует в C++20. Возможно, она предназначена для замены оригинальной формы construct?

https://en.cppreference.com/w/cpp/memory/allocator_traits/construct

Я не очень много работал с пользовательским распределением, поэтому у меня нет личного опыта использования этих функций, но кажется разумным, что они могут предпочесть статическую функцию в попытке разрушить зависимости.

Существует также функция construct_at, добавленная в C++20.

https://en.cppreference.com/w/cpp/memory/construct_at

2022 WebDevInsider