Namespaces
Variants

std::ranges:: construct_at

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
ヘッダーで定義 <memory>
呼び出しシグネチャ
template < class T, class ... Args >
constexpr T * construct_at ( T * location, Args && ... args ) ;
(C++20以降)

指定されたアドレス location args 内の引数で初期化された T オブジェクトを作成します。

以下と同等: 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_array_v < T > true であり、かつ sizeof... ( Args ) が非ゼロの場合、プログラムは不適格(ill-formed)です。

このページで説明されている関数ライクなエンティティは、 アルゴリズム関数オブジェクト (非公式には niebloids として知られる)です。すなわち:

目次

パラメータ

location - 初期化されていないストレージへのポインタ。ここに T オブジェクトが構築される
args... - 初期化に使用される引数

戻り値

location

注記

std::ranges::construct_at は、 std::construct_at と全く同じ動作をしますが、実引数依存の名前探索からは見えない点が異なります。

#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) unsigned char buf[sizeof(S)];
    S* ptr = std::ranges::construct_at(reinterpret_cast<S*>(buf), 42, 2.71828f, 3.1415);
    ptr->print();
    std::ranges::destroy_at(ptr);
}

出力:

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

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3436 C++20 construct_at は配列型のオブジェクトを作成できなかった 有界配列を値初期化できる
LWG 3870 C++20 construct_at はCV修飾型のオブジェクトを作成できた CV非修飾型のみが許可される

関連項目

指定されたアドレスのオブジェクトを破棄する
(アルゴリズム関数オブジェクト)
指定されたアドレスにオブジェクトを構築する
(関数テンプレート)