class property specifiers (since 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 | - | 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
specifier
(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
は、それが
置換適格
であり、かつ以下のいずれかの条件を満たす場合、
置換可能
です:
- replaceable_if_eligible を持つ class-prop-specifier
-
unionであり、ユーザー宣言された 特殊メンバ関数 を持たない - default movable である
交換対象の条件
クラス
C
は、以下のいずれかの条件に該当しない限り
置換可能
です:
- それが 基底クラス を持ち、その基底クラスが replaceable クラスではない場合
- それが 非静的データメンバ を持ち、そのメンバが replaceable 型ではない場合
-
C型のオブジェクトをC型の xvalue から 直接初期化 する際に、オーバーロード解決が失敗するか、削除されたコンストラクタが選択される場合 -
C型の lvalue にC型の xvalue を代入する際に、オーバーロード解決が失敗するか、削除された代入演算子関数が選択される場合 - それが 削除されたデストラクタ を持つ場合
自明な再配置可能性
クラスは、以下のいずれかの条件を満たす場合に 自明に再配置可能 (trivially relocatable) となります: 自明な再配置の適格性 (eligible for trivial relocation) を満たし、かつ:
- trivially_relocatable_if_eligible class-prop-specifier を持つ
-
unionであり、ユーザー宣言された 特殊メンバー関数 を持たない - default movable である
自明な再配置の適格性
クラスは、以下のいずれかを持つ場合を除き、 自明な再配置が可能 です:
- 任意の 仮想基底クラス
- 基底クラス が trivially relocatable クラスではない場合
- 非静的データメンバー のオブジェクト型が trivially relocatable 型ではない場合
- 削除されたデストラクタ
ただし、多態的なクラス型の1つ以上のサブオブジェクトを持つ、それ以外の条件を満たす
union
が
自明な再配置の対象となるかどうか
は実装定義である。
デフォルトの移動可能性
クラス
C
が
default movable
であるための条件は以下のすべてを満たすことです:
-
C型の direct-initializing による xvalue からのオブジェクト初期化におけるオーバーロード解決は、Cの直接のメンバーであり、ユーザー提供でも削除でもないコンストラクタを選択する -
C型の lvalue への xvalue からの代入におけるオーバーロード解決は、Cの直接のメンバーであり、ユーザー提供でも削除でもない代入演算子関数を選択する -
Cはユーザー提供でも削除でもない destructor を持つ
キーワード
final 、 replaceable_if_eligible 、 trivially_relocatable_if_eligible 。
注記
- すべての TriviallyCopyable クラスが replaceable または trivially relocatable であるとは限りません。
- アクセシビリティ は、 trivial relocatability または replaceability を判定する際に、 特殊メンバ関数 のアクセシビリティは考慮されません。
- const修飾または参照型の 非静的データメンバ を持つクラスは trivially relocatable となり得ます。
-
ユーザー宣言された
特殊メンバ関数
を持たず、かつ
default movable
である
unionとクラスは、クラスプロパティ指定子なしで定義された場合でも、 replaceable かつ trivially relocatable の両方となります。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__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 {}; // 不適格: 各クラスプロパティ指定子は最大1回のみ使用可能。 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クラス型かどうかをチェックする
(クラステンプレート) |