名前空間
変種
操作

クラスプロパティ指定子 (C++26以降)

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
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) (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 - finalreplaceable_if_eligibletrivially_relocatable_if_eligible のいずれか。

C++26より前では、class-prop-specifier-seq (optional) の代わりに class-virt-specifier (optional) があり、これはfinal 指定子 (C++11以降) 用の final のみを許可していた。

[編集] 解説

finalreplaceable_if_eligibletrivially_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) である。

[編集] 置換の適格性

クラス C は、以下のいずれでもない限り、置換に適格 (eligible for replacement) である。

[編集] 自明な再配置可能性

クラスは、自明な再配置に適格 (eligible for trivial relocation) であり、かつ以下のいずれかである場合、自明に再配置可能 (trivially relocatable) である。

[編集] 自明な再配置の適格性

クラスは、以下のいずれでもない限り、自明な再配置に適格 (eligible for trivial relocation) である。

ただし、多態性クラス型の1つ以上のサブオブジェクトを持つ、そうでなければ適格なunion自明な再配置に適格 (eligible for trivial relocation) であるかどうかは実装定義である。

[編集] デフォルトでのムーブ可能性

クラス C は、以下のすべての条件が満たされている場合、デフォルトでムーブ可能 (default movable) である。

  • Cxvalueから型 C のオブジェクトを直接初期化するためのオーバーロード解決が、C の直接メンバであり、ユーザー提供でも削除もされていないコンストラクタを選択する
  • Clvalueに型 Cxvalueを代入するためのオーバーロード解決が、C の直接メンバであり、ユーザー提供でも削除もされていない代入演算子関数を選択する
  • C は、ユーザー提供でも削除もされていないデストラクタを持つ。

[編集] キーワード

finalreplaceable_if_eligibletrivially_relocatable_if_eligible

[編集] 注釈

機能テストマクロ 規格 機能
__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クラス型であるかをチェックする
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)