namespace std::meta {
consteval info data_member_spec(info type, data_member_options options);
}
概要
データメンバの仕様を作成する。define_aggregate()で使用するデータメンバの仕様を表すリフレクションを返す。
戻り値
指定された型typeとオプションoptionsに基づくデータメンバの仕様を表すリフレクションを返す。
例外
以下のすべての条件を満たさない場合、std::meta::exception例外を送出する:
dealias(type)がオブジェクト型または参照型を表すことoptions.nameに値がある場合、それが有効な識別子(トークン)のつづりを含むこと(u8stringならUTF-8、stringなら通常のリテラルエンコーディングで解釈する。ユニバーサルキャラクタ名などの字句構造は処理されない)options.nameに値がない場合、options.bit_widthに値があり、かつoptions.annotationsが空であることoptions.bit_widthに値Vがある場合、次をすべて満たすこと:is_integral_type(type) || is_enum_type(type)がtrueであることoptions.alignmentに値がないことoptions.no_unique_addressがfalseであることVが負でないことVが0の場合、options.nameに値がないことoptions.nameに値がない場合、is_const(type) || is_volatile(type)がfalseであること
options.alignmentに値がある場合、それがalignment_of(type)以上のアライメント値であることoptions.annotationsの各リフレクションrについて、has-type(r)がtrueであり、type_of(r)が非配列オブジェクト型を表し、constant_of(r)の評価が例外で終了しないこと
例
#include <meta>
struct S;
consteval {
std::meta::define_aggregate(^^S, {
std::meta::data_member_spec(^^int, {.name = "x"}),
std::meta::data_member_spec(^^double, {.name = "y"})
});
}
int main() {
S s{1, 2.0};
static_assert(std::meta::is_data_member_spec(
std::meta::data_member_spec(^^int, {.name = "z"})));
}
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: 16 (
-freflectionオプション指定) ✅ - Visual C++: ??
関連項目
参照
- P2996R13 Reflection for C++26
- LWG Issue 4423.
meta::data_member_specallows negative bit-field widths- C++26で、
options.bit_widthの値Vが負でないことが例外送出条件に追加された。負のビット幅を指定できてしまう問題を防ぐもの
- C++26で、
- LWG Issue 4517.
data_member_specshould throw for cv-qualified unnamed bit-fields