C++26将首次引入纯编译期静态反射,不依赖RTTI、无运行时开销,支持类型名、成员枚举、函数签名等元信息提取,语法基于std::reflect和reflexpr,Clang 18+和GCC 14已部分支持。

C++中的反射提案已实质性推进,C++26标准将首次纳入静态反射(Static Reflection)能力,核心机制在2025年全球C++技术大会期间完成多轮验证与落地演示。它不是传统意义上的“运行时反射”,而是以零成本、纯编译期为设计前提的元编程增强。
C++26反射的核心定位:只做编译期的事
- 不依赖RTTI、不引入虚函数表开销、不增加二进制体积
- 所有操作(如获取类型名、字段列表、函数参数)都在
constexpr或consteval上下文中完成 - 语法围绕
std::reflect命名空间和reflexpr等新关键字/工具展开,例如:struct Point { int x; double y; }; constexpr auto meta = reflexpr(Point); // 编译期生成元对象 static_assert(std::meta::get_name_v == "Point");
编译期反射已明确支持的能力
- ✅ 类型名称、基类、访问控制(public/private)查询
- ✅ 结构体/类成员枚举(名称、偏移、类型、是否为静态/const等)
- ✅ 函数签名反射:参数数量、类型、名称(C++26新增)、默认值(部分编译器已实验支持)
- ✅ 模块导出函数的跨模块元数据提取(配合
export与import) - ✅ 成员指针自动生成(
std::reflect::pointer_v),用于安全字段访问
运行时反射?目前没有,也不在C++26路线图中
- 标准委员会明确区分:C++不做动态类型发现或运行时对象遍历(如Java/C#式
obj.getClass().getFields()) - 所谓“运行时信息获取”实际是编译期生成的静态描述 + 运行时轻量绑定,例如:
- 反射提取字段名 → 编译期生成字符串字面量数组
- 序列化函数中用
if constexpr展开字段循环 → 运行时无分支、无虚调用
- 真正的运行时类型查询仍需靠
typeid或第三方库(如Boost.TypeErasure),但不属于标准反射范畴
当前可用性与工具链支持
- Clang 18+ 已实现P0957R7草案子集(含
reflexpr、std::reflect::members等) - GCC 14 实验性支持基础类型反射,函数参数反射尚在集成中
- MSVC暂未公开C++26反射支持状态,但已参与标准讨论
- 需启用
-std=c++26 -freflection等实验性开关(具体依编译器而定)
基本上就这些。C++26反射不是“加个功能”,而是重构元编程范式——把原来靠宏、SFINAE、模板递归甚至代码生成器做的事,变成标准、安全、可读的编译期表达。它不复杂,但容易忽略其“纯静态”的边界。











