Spec-Zone.ru › C++

std::construct_at

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

Создаёт объект T, инициализированный аргументами из args, по заданному адресу location.

Эквивалентно
ifconstexpr(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++.

Отчёт об ошибке Применяется к Опубликованное поведение Корректное поведение
LWG 3436 C++20 construct_at не мог создавать объекты типов массивов может выполнять value-инициализацию массивов фиксированной длины

См. также

allocate
выделяет неинициализированную область памяти
(открытая функция-член std::allocator<T>)
construct
[статическая]
создаёт объект в выделенной области памяти
(шаблон функции)
destroy_at
(C++17)
уничтожает объект по заданному адресу
(шаблон функции и объект-функция алгоритма)
ranges::destroy_at
(C++20)
ranges::construct_at
(C++20)
создаёт объект по заданному адресу
(объект-функция алгоритма)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/construct_at

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API