Namespaces
Variants

std::construct_at

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジのアルゴリズム (C++20)
制約付きアルゴリズム、例:ranges::copy、ranges::sort、...
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割済みレンジに対する)
集合操作 (ソート済みレンジに対する)
マージ操作 (ソート済みレンジに対する)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書式比較操作
順列操作


 
 
ヘッダ <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>()...) は 未評価オペランド として扱われたときに well-formed である。

もし std::is_array_v<T> が true であり、sizeof...(Args) が非ゼロである場合、プログラムは ill-formed である。

パラメータ

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 適用先 公開時の動作 修正後の動作
LWG 3436 C++20 construct_at 配列型のオブジェクトを作成できませんでした 境界配列を値初期化できる

関連項目

未初期化のストレージを割り当てる
(std::allocator<T>の公開メンバ関数)
[static]
割り当てられたストレージ内にオブジェクトを構築する
(関数テンプレート)
(C++17)
指定されたアドレスのオブジェクトを破棄する
(関数テンプレート)
指定されたアドレスにオブジェクトを作成する
(アルゴリズム関数オブジェクト)