class property specifiers (since C++26)
指定某个类是 可替换的 ( replaceable_if_eligible )、 可平凡重定位的 ( trivially_relocatable_if_eligible ),或指定某个类不能被 派生 ( final )。
目录 |
语法
类属性说明符 出现在类定义的开头,紧接在类名之后,且不能在类声明中出现。
| 类关键字 属性 (可选) 类头名称 类属性说明符序列 (可选) 基句 (可选) | |||||||||
| class-prop-specifier-seq | - | 一个或多个 class-prop-specifier ,但每个最多只能出现一次。 |
| class-prop-specifier | - | 以下之一: final 、 replaceable_if_eligible 和 trivially_relocatable_if_eligible 。 |
在
(C++26)
之前,此处原本是
class-virt-specifier
(可选)
而非
class-prop-specifier-seq
(可选)
,该位置仅允许使用
final
说明符
的
final
(自 C++11 起)
。
说明
final 、 replaceable_if_eligible 和 trivially_relocatable_if_eligible 是在类头部使用时具有特殊含义的标识符。在其他上下文中,这些标识符不被保留,可用于命名对象和函数。
final 说明符
final 指定该类不得出现在其他类定义的 基类说明符列表 中(即不能被继承)。否则程序非良构(将生成编译时错误)。 final 也可用于 联合体 定义,此时该限定符不产生实际作用 (仅影响 std::is_final 的判定结果) (C++14 起) ,因为联合体本身不可被继承。
replaceable_if_eligible 说明符
replaceable_if_eligible 指明该类在 符合替换条件时 可被 替换 。
trivially_relocatable_if_eligible 说明符
trivially_relocatable_if_eligible 指定该类若 符合平凡重定位条件 ,则具有 平凡可重定位性 。
可替换性
一个类
C
是
可替换的
,当它
符合替换条件
且满足以下任一条件:
可替换性条件
类
C
是
可替换的
,除非满足以下任一条件:
- 它有一个 基类 ,且该基类不是 可替换 类
- 它有一个 非静态数据成员 ,且该成员的类型不是 可替换 类型
-
当从类型为
C的 xvalue 直接初始化 类型为C的对象时,重载决议失败或选择了被删除的构造函数 -
当从类型为
C的 xvalue 赋值给类型为C的 lvalue 时,重载决议失败或选择了被删除的赋值运算符函数 - 它有一个 被删除的析构函数
平凡可重定位性
一个类是 可平凡重定位的 ,当且仅当它 符合平凡重定位条件 且满足以下任一条件:
可平凡重定位的资格
一个类 符合平凡重定位条件 ,除非它具备以下任一特征:
除了以下情况:对于具有一个或多个多态类类型子对象的
union
,其是否
符合平凡重定位条件
是由实现定义的。
默认可移动性
当满足以下所有条件时,类
C
是
默认可移动的
:
-
用于从类型
C的 xvalue 对类型C对象进行 直接初始化 的重载决议,会选择作为C直接成员且既非用户提供亦非被删除的构造函数 -
用于从类型
C的 xvalue 向类型C的 lvalue 进行赋值的重载决议,会选择作为C直接成员且既非用户提供亦非被删除的赋值运算符函数 -
C具有一个既非用户提供亦非被删除的 析构函数
关键词
final 、 replaceable_if_eligible 、 trivially_relocatable_if_eligible 。
说明
- 并非所有 TriviallyCopyable 类都是 可替换的 或 可平凡重定位的 。
- 在确定 平凡重定位性 或 可替换性 时,不会考虑 特殊成员函数 的 访问权限 。
- 具有const限定或引用类型 非静态数据成员 的类可以是 可平凡重定位的 。
-
没有用户声明
特殊成员函数
的
union和 默认可移动 类,即使未使用类属性说明符定义,也同时具有 可替换性 和 平凡重定位性 。
| 特性测试宏 | 值 | 标准 | 特性 |
|---|---|---|---|
__cpp_trivial_relocatability
|
202502L
|
(C++26) | 平凡可重定位性 |
示例
struct final; // 正确:声明名为 'final' 的类, // 未使用类属性说明符 struct IF final; // 错误形式:类属性说明符 // 不能出现在函数声明中 struct F final {}; // 正确:说明符标记类 F 为不可派生 struct D: F {}; // 错误形式:类 F 不能作为基类被继承 // 正确:若符合条件,说明符标记类 R 为可替换 struct R replaceable_if_eligible {}; // 正确:若符合条件,说明符标记类 T 为可平凡重定位 struct T trivially_relocatable_if_eligible {}; // 正确:类可被标记多个类属性说明符 struct FRT final replaceable_if_eligible trivially_relocatable_if_eligible {}; // 错误形式:每个类属性说明符最多只能出现一次 struct FRF final replaceable_if_eligible final {}; int main() {}
参考文献
- C++26 标准 (ISO/IEC 14882:2026):
-
- 6.8.1 可平凡重定位与可替换类型 [basic.types.general]
参见
final
说明符
(C++11)
|
声明方法不可被重写或类不可被继承 |
|
(C++14)
|
检查类型是否为最终类类型
(类模板) |