- meta[meta header]
- std::meta[meta namespace]
- function template[meta id-type]
- cpp26[meta cpp]
namespace std::meta {
template <ranges::input_range R>
consteval info reflect_constant_array(R&& r);
}- info[link info.md]
構造的型または配列型の要素を持つRangeから、静的配列のリフレクションを生成する。
define_static_array()はspanを返すため実行時のアクセスには便利だが、spanは構造化束縛によるパック展開ができない。この関数は配列のリフレクションを返すため、スプライスして構造化束縛でパック展開する用途に使用できる。
また、define_static_array()はこの関数を内部で使用して実装されている。
説明用に、Uをranges::range_value_t<R>、Tをremove_all_extents_t<U>とする。以下をすべて満たすこと:
Tが構造的型(structural type)であることTがcopy_constructibleを満たすことUが配列型でない場合、is_constructible_v<T,ranges::range_reference_t<R>>がtrueであること
- 要素の型が配列型である場合、その各要素に対して再帰的にこの関数が適用される。これにより、多次元配列のリフレクションを生成できる(配列型は構造的型ではないため、この再帰的な扱いがなければ多次元配列は扱えない)
- 各要素は、範囲の対応する要素を間接参照して
T型へstatic_castした値(static_cast<T>(*it))で直接初期化される(コピー初期化ではない)。これにより、一時的なプロキシ参照を返す範囲(viewsのアダプタなど)に対しても正しく動作する
rの要素をコピーしたconst T[N]のテンプレートパラメータオブジェクトのリフレクションを返す。
以下のいずれかを送出する:
r、またはrを参照するイテレータ・番兵に対する任意の操作が送出する例外reflect_constantの引数の評価、またはこの関数(reflect_constant_array)の評価が送出する例外reflect_constantのいずれかの呼び出しが例外で終了する場合、std::meta::exception例外
#include <meta>
#include <array>
// 構造化束縛のパック展開はテンプレート文脈で使用する必要がある
template <int>
consteval int sum() {
// 配列のリフレクションをスプライスし、構造化束縛でパック展開
constexpr auto [...elems] =
[:std::meta::reflect_constant_array(std::array{1, 2, 3}):];
return (... + elems);
}
int main() {
static_assert(sum<0>() == 6);
}- std::meta::reflect_constant_array[color ff0000]
- C++26
- Clang: ??
- GCC: 16 (
-freflectionオプション指定) [mark verified] - Visual C++: ??
- P3491R3
define_static_{string,object,array} - LWG Issue 4432. Clarify element initialization for
meta::reflect_constant_array- C++26で、各要素が
static_cast<T>(*it)の値で直接初期化されることが明確化された。一時的なプロキシ参照を返す範囲アダプタに対する曖昧さを解消するもの
- C++26で、各要素が
- LWG Issue 4483. Multidimensional arrays are not supported by
meta::reflect_constant_arrayand related functions- C++26で、配列型の要素に対して再帰的にこの関数を適用することで、多次元配列がサポートされた