类性质说明符 (C++26 起)
指定类可替换 (replaceable_if_eligible),可平凡重定位 (trivially_relocatable_if_eligible),或者类不能被派生(final)。
目录 |
[编辑] 语法
类性质说明符出现于类定义的开头,紧跟类名之后,并且不能出现在类声明之内。
类关键词 属性 (可选) 类头名 类性质说明符序列 (可选) 基类子句 (可选) | |||||||||
类性质说明符序列 | - | 一或多个 类性质说明符 ,但每个最多仅可出现一次。 |
类性质说明符 | - | 下列之一:final、replaceable_if_eligible 和 trivially_relocatable_if_eligible。 |
此前(C++26),处于类性质说明符序列 (可选)位置的是类虚说明符 (可选),它仅允许作为 final
说明符的 final (C++11 起)。
[编辑] 解释
final、replaceable_if_eligible 和 trivially_relocatable_if_eligible 是在类头中使用时具有特殊含义的标识符。其他语境中,它们并非保留词,且可用于命名对象和函数。
[编辑] final 说明符
final 指定,这个类不能出现在其他类定义的基类说明符列表 中(换言之,它不能被派生)。否则程序非良构(生成一条编译时错误)。final 也可用于 union 定义,这种情况下无效果(除了 std::is_final 的结果外)(C++14 起),因为联合体不能被派生。
[编辑] replaceable_if_eligible 说明符
replaceable_if_eligible 指定,如果这个类有替换资格 ,则它可替换 。
[编辑] trivially_relocatable_if_eligible 说明符
trivially_relocatable_if_eligible 指定,如果这个类有可平凡重定位资格 ,则它可平凡重定位 。
[编辑] 可替换性
如果类 C
有替换资格 ,并且以下之一成立,则它可替换 :
[编辑] 替换的资格
除非以下之一成立,否则类 C
均有替换资格 :
- 具有并非可替换 类的基类
- 具有并非为可替换 类型的非静态数据成员
- 针对以
C
类型的亡值对C
类型的对象进行直接初始化的重载解析失败,或者找到弃置的构造函数 - 针对以
C
类型的亡值对C
类型的左值进行赋值的重载解析失败,或者找到弃置的赋值运算符函数 - 具有弃置的析构函数
[编辑] 可平凡重定位性
如果类有可平凡重定位资格 ,并且以下之一成立,则它可平凡重定位 :
[编辑] 可平凡重定位的资格
除非类具有下列之一,否则类有可平凡重定位资格 :
但,具有一个或多个多态类类型子对象的 union 是否有可平凡重定位资格 是由实现定义的。
[编辑] 默认可移动性
如果以下条件均满足,那么类 C
是默认可移动 的:
- 针对以
C
类型的亡值对C
类型的对象进行直接初始化的重载解析,选择的是作为C
的直接成员的构造函数,且它既非用户提供也未被弃置。 - 针对以
C
类型的亡值对C
类型的左值进行赋值的重载解析,选择的是作为C
的直接成员的赋值运算符函数,且它既非用户提供也未被弃置。 -
C
有一个析构函数且它既非用户提供也未被弃置。
[编辑] 关键词
final, replaceable_if_eligible, trivially_relocatable_if_eligible
[编辑] 注解
- 并非所有可平凡复制 (TriviallyCopyable) 类都可替换 或可平凡重定位 的。
- 在设立可平凡重定位 或可替换性 时,不考虑特殊成员函数的可访问性。
- 带有 const 限定的或者引用非静态数据成员的类可以是可平凡重定位 的。
- 没有用户声明特殊成员函数的
union
,和默认可移动 的类,都是可替换 且可平凡重定位 的,即使定义时没有类性质说明符也是如此。
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_trivial_relocatability |
202502L |
(C++26) | 可平凡重定位性 |
[编辑] 示例
struct final; // OK;声明名为 'final' 的类,未使用类性质说明符。 struct IF final; // 非良构:类性质说明符不能出现在函数声明中。 struct F final {}; // OK;说明符将类 F 标记为不能派生。 struct D: F {}; // 非良构:类 F 不能被派生。 // OK;说明符将类 R 标记为若有资格则可替换。 struct R replaceable_if_eligible {}; // OK;说明符将类 T 标记为若有资格则可平凡定位。 struct T trivially_relocatable_if_eligible {}; // OK;一个类可以使用多个类性质说明符标记。 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 Trivially relocatable and replaceable types [basic.types.general]
[编辑] 参阅
final 说明符 (C++11)
|
声明方法不能被覆盖,或类不能被派生 |
(C++14) |
检查类型是否为 final 类类型 (类模板) |