類屬性說明符 (自 C++26 起)
指定一個類是*可替換的*(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 | - | 以下之一:final、replaceable_if_eligible 和 trivially_relocatable_if_eligible。 |
在 C++26 之前,class-prop-specifier-seq (可選) 的位置是 class-virt-specifier (可選),它只允許對 final
說明符 (自 C++11 起)使用 final。
[編輯] 解釋
final、replaceable_if_eligible 和 trivially_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
符合替換條件,除非滿足以下任一條件:
- 它有一個基類不是可替換的類
- 它有一個非靜態資料成員不是可替換的型別
- 當從型別
C
的右值直接初始化型別為C
的物件時,過載決議失敗或選擇了一個被刪除的建構函式 - 當從型別
C
的右值賦值給型別C
的左值時,過載決議失敗或選擇了一個被刪除的賦值運算子函式 - 它有一個被刪除的解構函式。
[編輯] 平凡重定位性
如果一個類符合平凡重定位條件,並且滿足以下任一條件,則它是可平凡重定位的:
[編輯] 平凡重定位資格
一個類符合平凡重定位的條件,除非它具有以下任一情況:
但是,對於一個本來符合條件的,擁有一個或多個多型類子物件的union
,其是否符合平凡重定位的條件是實現定義的。
[編輯] 預設可移動性
如果滿足以下所有條件,則類 C
預設可移動:
- 從型別
C
的右值直接初始化型別C
的物件的過載決議,選擇了一個直接成員於C
且既非使用者提供也未刪除的建構函式 - 從型別
C
的右值賦值給型別C
的左值的過載決議,選擇了一個直接成員於C
且既非使用者提供也未刪除的賦值運算子函式 -
C
有一個既非使用者提供也未刪除的解構函式。
[編輯] 關鍵詞
final, replaceable_if_eligible, trivially_relocatable_if_eligible。
[編輯] 注意
- 並非所有可平凡複製的類都是可替換的或可平凡重定位的。
- 在確定平凡重定位性或可替換性時,不考慮特殊成員函式的可訪問性。
- 帶有 const 限定或引用型別的非靜態資料成員的類可以是可平凡重定位的。
- 沒有使用者宣告的特殊成員函式的
union
和預設可移動的類既是可替換的,也是可平凡重定位的,即使在定義時沒有類屬性說明符。
功能測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__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 類型別 (類模板) |