std::meta::size_of

来自cppreference.com
< 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 表示空基类直接基类关系,结果也不为零。

示例

可在 Compiler Explorer 预览。

#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);
        // 错误: '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));
    // 错误: 'std::meta::exception' 类型的未捕获异常;
    // 'what()': 'reflection not suitable for size_of'

int main() {}

参阅

返回所反射对象或类型的对齐值
(函数) [编辑]
返回所反射对象或类型的大小(位数)
(函数) [编辑]