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

履歴 編集

constexpr構造化束縛の許可と、constexpr参照の制限緩和 [P2686R5](C++26)

このページは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参照の制限として、参照する変数のアドレスが、参照または構造化束縛が存在するスタックフレームを基準とした定数である場合に限られる。

関連項目

参照