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)
             
            
           
           | 检查类型是否为最终类类型 (类模板) |