名前空間
変種
操作

std::ranges::construct_at

From cppreference.com
< cpp‎ | memory
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
ranges::construct_at
(C++20)
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
ヘッダ <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 まで)

ある定数式 expr の評価で construct_at が呼び出された場合、locationstd::allocator<T>::allocate によって取得されたストレージ、または expr の評価内でその生存期間が始まったオブジェクトを指していなければなりません。

このオーバーロードは、以下のすべての条件が満たされた場合にのみオーバーロード解決に参加する。

std::is_array_v<T>true であり、かつ sizeof...(Args) がゼロ以外の場合、プログラムは不整形式です。

このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式にはニーブロイドとして知られている)です。つまり、

目次

[編集] パラメータ

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非修飾型のみが許可されます。

[編集] 関連項目

与えられたアドレスのオブジェクトを破棄します
(アルゴリズム関数オブジェクト)[編集]
与えられたアドレスにオブジェクトを作成します
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)