std::meta::size_of
来自cppreference.com
| 在标头 <meta> 定义
|
||
| |
(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 的指针”相同。这与非静态引用成员的表示方式相匹配。
示例
可在 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() {}
参阅
(C++26) |
返回所反射对象或类型的对齐值 (函数) |
(C++26) |
返回所反射对象或类型的大小(位数) (函数) |