最終更新日時(UTC):
が更新

履歴 編集

constexpr配置new [P2747R2](C++26)

このページは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に対応する

関連項目

参照