std::meta::size_of
来自 zh.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 的指针”。这与非静态引用成员的表示方式一致。
示例
运行此代码
#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) |
返回反射对象或类型的位大小 (函数) |