Namespaces
Variants

std::meta::size_of

来自 zh.cppreference.net
< cpp | meta
 
 
 
反射库
 
反射类型和查询
反射查询
反射布局查询
类型属性
类型属性查询
 
定义于头文件 <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() {}

参见

返回反射对象或类型的对齐方式
(函数)
返回反射对象或类型的位大小
(函数)