std:: construct_at
|
Определено в заголовке
<memory>
|
||
|
template
<
class
T,
class
...
Args
>
constexpr T * construct_at ( T * location, Args && ... args ) ; |
(начиная с C++20) | |
Создает объект
T
инициализированный аргументами из
args
по заданному адресу
location
.
Эквивалентно
if
constexpr
(
std::
is_array_v
<
T
>
)
return
::
new
(
voidify
(
*
location
)
)
T
[
1
]
(
)
;
else
return
::
new
(
voidify
(
*
location
)
)
T
(
std::
forward
<
Args
>
(
args
)
...
)
;
, за исключением того, что
construct_at
может использоваться при вычислении
константных выражений
(до C++26)
.
Когда
construct_at
вызывается при вычислении некоторого константного выражения
expr
,
location
должен указывать либо на память, полученную с помощью
std::
allocator
<
T
>
::
allocate
, либо на объект, время жизни которого началось в процессе вычисления
expr
.
Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:
- std:: is_unbounded_array_v < T > имеет значение false .
- :: new ( std:: declval < void * > ( ) ) T ( std:: declval < Args > ( ) ... ) является корректным выражением при рассмотрении в качестве невычисляемого операнда .
Если std:: is_array_v < T > равно true и sizeof... ( Args ) не равно нулю, программа является некорректной.
Содержание |
Параметры
| location | - |
указатель на неинициализированную область памяти, в которой будет сконструирован объект типа
T
|
| args... | - | аргументы, используемые для инициализации |
Возвращаемое значение
location
Пример
#include <bit> #include <memory> class S { int x_; float y_; double z_; public: constexpr S(int x, float y, double z) : x_{x}, y_{y}, z_{z} {} [[nodiscard("no side-effects!")]] constexpr bool operator==(const S&) const noexcept = default; }; consteval bool test() { alignas(S) unsigned char storage[sizeof(S)]{}; S uninitialized = std::bit_cast<S>(storage); std::destroy_at(&uninitialized); S* ptr = std::construct_at(std::addressof(uninitialized), 42, 2.71f, 3.14); const bool res{*ptr == S{42, 2.71f, 3.14}}; std::destroy_at(ptr); return res; } static_assert(test()); int main() {}
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3436 | C++20 |
construct_at
could not create objects of array types
|
can value-initialize bounded arrays |
| LWG 3870 | C++20 |
construct_at
could create objects of cv-qualified types
|
only cv-unqualified types are permitted |
Смотрите также
|
выделяет неинициализированную память
(публичная функция-член
std::allocator<T>
)
|
|
|
[static]
|
создает объект в выделенной памяти
(шаблон функции) |
|
(C++17)
|
уничтожает объект по заданному адресу
(шаблон функции) |
|
(C++20)
|
создает объект по заданному адресу
(функциональный объект алгоритма) |