このページはC++26に採用される見込みの言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
C++26では、定数式の文脈での構造化束縛が許可されるようになり、constexpr
変数への参照が定数式として扱われるようになる。
constexpr
構造化束縛の許可
C++23までは構造化束縛をconstexpr
として使用することはできなかったが、C++26では以下のようなコードが許可される。
constexpr std::tuple<int, int> p{1, 2};
constexpr auto [x, y] = p; // C++26: OK
構造化束縛は以下のように参照に展開されるため、constexpr
参照と同じ制限を受ける:
void f() {
constexpr std::tuple<int, int> p{1, 2};
constexpr const auto& x = get<0>(p);
constexpr const auto& y = get<1>(p);
}
constexpr
変数への参照の制限緩和
constexpr
参照はC++23まで、静的記憶域をもつ変数への参照のみ許可されていた (テンプレートパラメータのtemplate <auto& r>
も同様)。C++26ではその制限が緩和され、自動記憶域 (ブロックスコープ) をもつ変数でもconstexpr
参照ができるようになる。
void f() {
constexpr int a = 42;
constexpr const int& ref = a; // C++23: NG, C++26: OK
}
ただしconstexpr
参照の制限として、参照する変数のアドレスが、参照または構造化束縛が存在するスタックフレームを基準とした定数である場合に限られる。