Daily bit(e) C++. std::make_unique_for_overwrite, std::make_shared_for_overwrite и std::allocate_shared_for_overwrite

Добавлено 17 марта 2024 в 02:26

Daily bit(e) C++ 440. Набор функций создания умных указателей в C++20: std::make_unique_for_overwrite, std::make_shared_for_overwrite и std::allocate_shared_for_overwrite.

Daily bit(e) C++

Стандарт C++20 представил новый набор функций создания умных указателей: std::make_unique_for_overwrite, std::make_shared_for_overwrite и std::allocate_shared_for_overwrite.

Эти варианты инициализируют выделенную память значениями по умолчанию, в отличие от предыдущих вариантов с инициализацией значениями.

Это позволяет избежать дублирующей инициализации POD типов при немедленной перезаписи памяти.

#include <memory>
#include <memory_resource>

auto p1 = std::make_unique_for_overwrite<int>();
// decltype(p1) == std::unique_ptr<int>, *p1 == неопределенное значение

auto p2 = std::make_shared_for_overwrite<int>();
// decltype(p2) == std::shared_ptr<int>, *p2 == неопределенное значение

std::pmr::monotonic_buffer_resource mr;
std::pmr::polymorphic_allocator<int> alloc{&mr};
auto p3 = std::allocate_shared_for_overwrite<int>(alloc);
// decltype(p3) == std::shared_ptr<int>, *p3 == неопределенное значение

// Перегрузки также поддерживают массивы, инициализируемые по умолчанию
auto p4 = std::make_unique_for_overwrite<int[]>(7); // 7 элементов
// decltype(p4) == std::unique_ptr<int[]>, p4[0] == неопределенное значение

auto p5 = std::make_shared_for_overwrite<int[]>(7);
// decltype(p5) == std::shared_ptr<int[]>, p5[0] == неопределенное значение

auto p6 = std::allocate_shared_for_overwrite<int[]>(alloc, 7);
// decltype(p6) == std::shared_ptr<int[]>, p6[0] == неопределенное значение

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++ПрограммированиеУмные указатели