このページはC++26に採用される見込みの言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
C++26では、配置new
構文を定数式の文脈で使用できるようになる。
template <class T, class... Args>
constexpr void f(T* p, Args... args) {
new (p) T(args...); // C++26: OK
}
C++20では、std::construct_at()
関数が導入された。この関数にはconstexpr
がついており、コンパイラが特別扱いすることによって、コンパイル時に配置new
相当のことができた。
しかし、配置new
構文とstd::construct_at()
では、できることに大きな差がある。
操作 | 配置new |
std::construct_at() |
---|---|---|
値初期化 | new (p) T(args...) |
std::construct_at(p, args...) |
デフォルト初期化 | new (p) T |
できない。std::default_construct_at() が提案されている |
リスト初期化 | new (p) T{a, b} |
できない |
指示付き初期化 | new (p) T{.a=a, .b=b} |
できない。関数で表現する方法が現状ない |
これらの表現力の違いから、配置new
構文自体がconstexpr
内で使用できることとなった。
関連して、<new>
ライブラリの配置new
演算子もまた、constexpr
に対応する