Пространства имён
Варианты
Действия

std::construct_at

Материал из cppreference.com
< cpp‎ | memory
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования(C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
Определено в заголовочном файле <memory>
template<class T, class... Args>
constexpr T* construct_at( T* p, Args&&... args);
(начиная с C++20)

Создаёт объект T, инициализированный аргументами args... по заданному адресу p. Специализация этой шаблонной функции участвует в разрешении перегрузки, только если ::new(std::declval<void*>()) T(std::declval<Args>()...) корректно в неоценённом контексте.

Эквивалентно
return::new(static_cast<void*>(p)) T(std::forward<Args>(args)...);
за исключением того, что construct_at может быть использована при вычислении константных выражений.

Когда construct_at вызывается при оценке некоторого константного выражения e, аргумент p должен указывать на хранилище, полученное std::allocator<T>::allocate, или объект, время жизни которого началось при вычислении e.

Содержание

[править]Параметры

p указатель на неинициализированное хранилище, в котором будет создан объект T
args... аргументы, используемые для инициализации

[править]Возвращаемое значение

p

[править]Пример

#include <iostream>#include <memory>   struct S {int x;float y;double z;   S(int x, float y, double z): x{x}, y{y}, z{z}{std::cout<<"S::S();\n";}   ~S(){std::cout<<"S::~S();\n";}   void print()const{std::cout<<"S { x="<< x <<"; y="<< y <<"; z="<< z <<"; };\n";}};   int main(){ alignas(S)unsignedchar storage[sizeof(S)];   S* ptr = std::construct_at(reinterpret_cast<S*>(storage), 42, 2.71828f, 3.1415); ptr->print();   std::destroy_at(ptr);}

Вывод:

S::S(); S { x=42; y=2.71828; z=3.1415; }; S::~S();

[править]Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 3870 C++20 construct_at может создавать объекты
cv-квалифицированных типов
разрешены только cv-квалифицированные типы

[править]Смотрите также

выделяет неинициализированное хранилище
(public функция-элемент std::allocator)[править]
[static]
создаёт объект в выделенном хранилище
(шаблон функции)[править]
(C++17)
уничтожает объект по заданному адресу
(шаблон функции)[править]
создаёт объект по заданному адресу
(ниблоид)[править]
close