Namespaces
Variants

class property specifiers (since C++26)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

指定某个类是 可替换的 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 可替换的 ,除非满足以下任一条件:

平凡可重定位性

一个类是 可平凡重定位的  ,当且仅当它 符合平凡重定位条件  且满足以下任一条件:

可平凡重定位的资格

一个类 符合平凡重定位条件 ,除非它具备以下任一特征:

除了以下情况:对于具有一个或多个多态类类型子对象的 union ,其是否 符合平凡重定位条件 是由实现定义的。

默认可移动性

当满足以下所有条件时,类 C 默认可移动的

  • 用于从类型 C xvalue 对类型 C 对象进行 直接初始化 的重载决议,会选择作为 C 直接成员且既非用户提供亦非被删除的构造函数
  • 用于从类型 C xvalue 向类型 C lvalue 进行赋值的重载决议,会选择作为 C 直接成员且既非用户提供亦非被删除的赋值运算符函数
  • C 具有一个既非用户提供亦非被删除的 析构函数

关键词

final replaceable_if_eligible trivially_relocatable_if_eligible

说明

特性测试宏 标准 特性
__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)
检查类型是否为最终类类型
(类模板)