std::ranges::construct_at
| ヘッダ <memory>
|
||
| で定義 |
||
template< class T, class... Args >
constexpr T* construct_at( T* location, Args&&... args );
|
呼び出しシグネチャ | |
(C++20以上)Targs 内の引数で初期化されたオブジェクトを、指定されたアドレス 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 です。
このページで説明されている関数のようなエンティティは アルゴリズム関数オブジェクト です(非公式には 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 配列型のオブジェクトを作成できませんでした
|
境界のある配列を値初期化できる |
関連項目
(C++20) |
指定されたアドレスにあるオブジェクトを破棄する (アルゴリズム関数オブジェクト) |
(C++20) |
指定されたアドレスにオブジェクトを作成する (関数テンプレート) |