类性质说明符 (C++26 起)

来自cppreference.com
< cpp‎ | language


 
 
C++ 语言
 
 

指定类可替换 replaceable_if_eligible),可平凡重定位 trivially_relocatable_if_eligible),或者类不能被派生final)。

目录

[编辑] 语法

类性质说明符出现于类定义的开头,紧跟类名之后,并且不能出现在类声明之内。

类关键词 属性 (可选) 类头名 类性质说明符序列 (可选) 基类子句 (可选)
类性质说明符序列 - 一或多个 类性质说明符 ,但每个最多仅可出现一次。
类性质说明符 - 下列之一:finalreplaceable_if_eligibletrivially_relocatable_if_eligible

此前(C++26),处于类性质说明符序列 (可选)位置的是类虚说明符 (可选),它仅允许作为 final 说明符final (C++11 起)

[编辑] 解释

finalreplaceable_if_eligibletrivially_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有替换资格 

[编辑] 可平凡重定位性

如果类有可平凡重定位资格 ,并且以下之一成立,则它可平凡重定位 

[编辑] 可平凡重定位的资格

除非类具有下列之一,否则类有可平凡重定位资格 

但,具有一个或多个多态类类型子对象的 union 是否有可平凡重定位资格 是由实现定义的。

[编辑] 默认可移动性

如果以下条件均满足,那么类 C默认可移动 的:

  • 针对以 C 类型的亡值C 类型的对象进行直接初始化的重载解析,选择的是作为 C 的直接成员的构造函数,且它既非用户提供也未被弃置。
  • 针对以 C 类型的亡值C 类型的左值进行赋值的重载解析,选择的是作为 C 的直接成员的赋值运算符函数,且它既非用户提供也未被弃置。
  • C 有一个析构函数且它既非用户提供也未被弃置。

[编辑] 关键词

final, replaceable_if_eligible, trivially_relocatable_if_eligible

[编辑] 注解

功能特性测试宏 标准 功能特性
__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 类类型
(类模板) [编辑]