std::meta::size_of
ja.cppreference.net から
| ヘッダ <meta>
|
||
consteval std::size_t size_of( std::meta::info r );
|
(C++26から) | |
r で表される型または(サブ)オブジェクトのサイズを返します。
引数
| r | - | リフレクション値 |
戻り値
r が型 「T への参照」を表す場合、sizeof(T*) を返します。
そうでなければ、r が型 U を表す場合、sizeof(U) を返します。
そうでなければ、std::meta::size_of(std::meta::type_of(r)) と同等です。
例外
以下の条件をすべて満たさない場合、std::meta::exception を投げます:
std::meta::dealias(r)は以下のいずれかを表す:
std::meta::dealias(r)が型を表す場合、std::meta::is_complete_type(r)はtrueです。
注釈
この関数は、「T への参照」を「T へのポインタ」と同じように扱います。これは非静的参照メンバの表現と一致します。
r が直接基底クラス関係 の 空の基底クラスを表す場合でも、結果はゼロ以外です。
例
このコードを実行する
#include <meta>
static_assert(std::meta::size_of(^^int) == sizeof(int));
static_assert(std::meta::size_of(^^int*) == sizeof(int*));
consteval bool test()
{
struct A;
// constexpr auto _ = std::meta::size_of(^^A);
// error: uncaught exception of type 'std::meta::exception';
// 'what()': 'reflection with incomplete type in size_of'
return true;
}
static_assert(test());
struct B { int i, j; };
static_assert(sizeof(B) == std::meta::size_of(^^B));
template<class T>
struct C { T m; };
static_assert(size_of(^^C<char>) == sizeof(char));
struct D { int x : 015; };
static_assert(size_of(^^D) == sizeof(int));
// static_assert(size_of(^^D::x) == sizeof(int));
// error: uncaught exception of type 'std::meta::exception';
// 'what()': 'reflection not suitable for size_of'
int main() {}
関連項目
(C++26) |
リフレクションされたオブジェクトまたは型のアライメントを返します (関数) |
(C++26) |
リフレクションされたオブジェクトまたは型のビット単位のサイズを返します (関数) |