名稱空間
變體
操作

類屬性說明符 (自 C++26 起)

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
通用主題
流程控制
條件執行語句
if
迭代語句(迴圈)
for
range-for (C++11)
跳轉語句
函式
函式宣告
Lambda 函式表示式
inline 說明符
動態異常規範 (直到 C++17*)
noexcept 說明符 (C++11)
異常
名稱空間
型別
說明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期說明符
初始化
表示式
替代表示
字面量
布林 - 整數 - 浮點
字元 - 字串 - nullptr (C++11)
使用者定義 (C++11)
工具
屬性 (C++11)
型別
typedef 宣告
類型別名宣告 (C++11)
型別轉換
記憶體分配
類特有的函式屬性
explicit (C++11)
static

特殊成員函式
模板
雜項
 
 

指定一個類是*可替換的*(replaceable_if_eligible),*可平凡重定位的*(trivially_relocatable_if_eligible),或者一個類不能被派生final)。

目錄

[編輯] 語法

類屬性說明符出現在類定義的開頭,緊接在類名之後,並且不能出現在類宣告中。

class-key attr (可選) class-head-name class-prop-specifier-seq (可選) base-clause (可選)
class-prop-specifier-seq - 一個或多個 class-prop-specifier ,但每個最多隻能出現一次。
class-prop-specifier - 以下之一:finalreplaceable_if_eligibletrivially_relocatable_if_eligible

C++26 之前,class-prop-specifier-seq (可選) 的位置是 class-virt-specifier (可選),它只允許對 final 說明符 (自 C++11 起)使用 final

[編輯] 解釋

finalreplaceable_if_eligibletrivially_relocatable_if_eligible 是在類頭中使用時具有特殊含義的識別符號。在其他上下文中,它們不是保留字,可以用於命名物件和函式。

[編輯] final 說明符

final 指定此類不能出現在其他類定義的 base-specifier-list 中(換句話說,不能被派生)。否則程式將是病態的(會生成編譯時錯誤)。final 也可以與 union 定義一起使用,在這種情況下它沒有效果(除了對 std::is_final 結果的影響)(自 C++14 起),因為 union 不能被派生。

[編輯] 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; declares a class named 'final',
                   // does not use class property specifiers.
struct IF final;   // Ill-formed: class property specifiers
                   // cannot appear at function declaration.
struct F final {}; // OK; specifier marks class F as non-derivable.
struct D: F {};    // Ill-formed: class F cannot be derived from.
 
// OK; specifier marks class R as 𝘳𝘦𝘱𝘭𝘢𝘤𝘦𝘢𝘣𝘭𝘦 if eligible.
struct R replaceable_if_eligible {};
 
// OK; specifier marks class T as 𝘵𝘳𝘪𝘷𝘪𝘢𝘭𝘭𝘺 𝘳𝘦𝘭𝘰𝘤𝘢𝘵𝘢𝘣𝘭𝘦 if eligible.
struct T trivially_relocatable_if_eligible {};
 
// OK; a class can be marked with multiple class property specifiers.
struct FRT final replaceable_if_eligible trivially_relocatable_if_eligible {};
 
// Ill-formed: each class property specifier can appear at most once.
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)
檢查型別是否為 final 類型別
(類模板) [編輯]