クラスプロパティ指定子 (C++26以降)
クラスが置換可能 (replaceable) (replaceable_if_eligible)、自明に再配置可能 (trivially relocatable) (trivially_relocatable_if_eligible) であること、または他のクラスから派生できないこと (final) を指定する。
目次 |
[編集] 構文
クラスプロパティ指定子は、クラス定義の先頭、クラス名の直後に現れ、クラス宣言には現れることはできない。
| class-key attr (optional) class-head-name class-prop-specifier-seq (optional) base-clause (optional) | |||||||||
| class-prop-specifier-seq | - | 1つ以上の class-prop-specifier 。ただし、それぞれ最大1回まで出現できる。 |
| class-prop-specifier | - | final、replaceable_if_eligible、trivially_relocatable_if_eligible のいずれか。 |
C++26より前では、class-prop-specifier-seq (optional) の代わりに class-virt-specifier (optional) があり、これはfinal 指定子 (C++11以降) 用の final のみを許可していた。
[編集] 解説
final、replaceable_if_eligible、trivially_relocatable_if_eligible は、クラスヘッダで使用された場合に特別な意味を持つ識別子である。他のコンテキストでは予約されておらず、オブジェクトや関数の名前に使用できる。
[編集] final 指定子
final は、このクラスが他のクラス定義の base-specifier-list に現れてはならない (つまり、派生できない) ことを指定する。そうでない場合、プログラムは不適格 (コンパイル時エラーが発生する)。final は共用体定義でも使用できるが、この場合、共用体は派生できないため、効果はない (std::is_final の結果以外に)(C++14以降)。
[編集] replaceable_if_eligible 指定子
replaceable_if_eligible は、このクラスが置換に適格 (eligible for replacement)である場合、置換可能 (replaceable)であることを指定する。
[編集] trivially_relocatable_if_eligible 指定子
trivially_relocatable_if_eligible は、このクラスが自明な再配置に適格 (eligible for trivial relocation)である場合、自明に再配置可能 (trivially relocatable)であることを指定する。
[編集] 置換可能性
クラス C は、置換に適格 (eligible for replacement) であり、かつ以下のいずれかである場合、置換可能 (replaceable) である。
- replaceable_if_eligible class-prop-specifier を持つ
- ユーザー宣言された特殊メンバ関数を持たない
unionである - デフォルトでムーブ可能 (default movable)である。
[編集] 置換の適格性
クラス C は、以下のいずれでもない限り、置換に適格 (eligible for replacement) である。
- 基底クラスが置換可能 (replaceable)クラスではない
- 非静的データメンバが置換可能 (replaceable)型ではない
- 型
Cのxvalueから型Cのオブジェクトを直接初期化する際に、オーバーロード解決が失敗するか、削除されたコンストラクタが選択される - 型
Cのlvalueに型Cのxvalueを代入する際に、オーバーロード解決が失敗するか、削除された代入演算子関数が選択される - 削除されたデストラクタを持つ。
[編集] 自明な再配置可能性
クラスは、自明な再配置に適格 (eligible for trivial relocation) であり、かつ以下のいずれかである場合、自明に再配置可能 (trivially relocatable) である。
- trivially_relocatable_if_eligible class-prop-specifier を持つ
- ユーザー宣言された特殊メンバ関数を持たない
unionである - デフォルトでムーブ可能 (default movable)である。
[編集] 自明な再配置の適格性
クラスは、以下のいずれでもない限り、自明な再配置に適格 (eligible for trivial relocation) である。
- 任意の仮想基底クラス
- 基底クラスが自明に再配置可能 (trivially relocatable)クラスではない
- オブジェクト型である非静的データメンバが自明に再配置可能 (trivially relocatable)型ではない
- 削除されたデストラクタ
ただし、多態性クラス型の1つ以上のサブオブジェクトを持つ、そうでなければ適格なunionが自明な再配置に適格 (eligible for trivial relocation) であるかどうかは実装定義である。
[編集] デフォルトでのムーブ可能性
クラス C は、以下のすべての条件が満たされている場合、デフォルトでムーブ可能 (default movable) である。
- 型
Cのxvalueから型Cのオブジェクトを直接初期化するためのオーバーロード解決が、Cの直接メンバであり、ユーザー提供でも削除もされていないコンストラクタを選択する - 型
Cのlvalueに型Cのxvalueを代入するためのオーバーロード解決が、Cの直接メンバであり、ユーザー提供でも削除もされていない代入演算子関数を選択する -
Cは、ユーザー提供でも削除もされていないデストラクタを持つ。
[編集] キーワード
final、replaceable_if_eligible、trivially_relocatable_if_eligible。
[編集] 注釈
- すべてのTriviallyCopyableクラスが置換可能 (replaceable) または自明に再配置可能 (trivially relocatable)であるわけではない。
- 自明な再配置可能性 (trivial relocatability) または置換可能性 (replaceability)を確立する際に、特殊メンバ関数のアクセス可能性は考慮されない。
- const修飾または参照型の非静的データメンバを持つクラスは自明に再配置可能 (trivially relocatable)になり得る。
- ユーザー宣言された特殊メンバ関数を持たない
unionとデフォルトでムーブ可能 (default movable)なクラスは、クラスプロパティ指定子なしで定義されている場合でも、両方とも置換可能 (replaceable)であり自明に再配置可能 (trivially relocatable)である。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_trivial_relocatability |
202502L |
(C++26) | Trivial relocatability |
[編集] 例
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 Trivially relocatable and replaceable types [basic.types.general]
[編集] 関連項目
final指定子 (C++11) |
メソッドがオーバーライドできないこと、またはクラスが派生できないことを宣言します |
| (C++14) |
型がfinalクラス型であるかをチェックする (クラステンプレート) |