std::construct_at
Материал из cppreference.com
Определено в заголовочном файле <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) | уничтожает объект по заданному адресу (шаблон функции) |
(C++20) | создаёт объект по заданному адресу (ниблоид) |