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
.
Стандарт 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] == неопределенное значение