Namensräume
Varianten
Aktionen

Klasseneigenschafts-Spezifizierer (seit C++26)

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

Gibt an, dass eine Klasse ersetzbar  (replaceable_if_eligible), trivial umzugruppierbar  (trivially_relocatable_if_eligible) ist oder dass von einer Klasse abgeleitet werden kann (final).

Inhalt

[edit] Syntax

Klasseneigenschafts-Spezifizierer erscheinen am Anfang der Klassendefinition, unmittelbar nach dem Namen der Klasse, und dürfen nicht in einer Klassendeklaration erscheinen.

class-key attr (optional) class-head-name class-prop-specifier-seq (optional) base-clause (optional)
class-prop-specifier-seq - ein oder mehrere class-prop-specifier , wobei jeder höchstens einmal auftreten darf.
class-prop-specifier - einer von final, replaceable_if_eligible und trivially_relocatable_if_eligible.

Vor (C++26) gab es class-virt-specifier (optional) anstelle von class-prop-specifier-seq (optional), der nur final für den final-Spezifizierer erlaubte (seit C++11).

[edit] Erklärung

final, replaceable_if_eligible und trivially_relocatable_if_eligible sind Bezeichner mit besonderer Bedeutung, wenn sie in einem Klassen-Header verwendet werden. In anderen Kontexten sind sie nicht reserviert und können zur Benennung von Objekten und Funktionen verwendet werden.

[edit] final-Spezifizierer

final gibt an, dass diese Klasse nicht in der base-specifier-list einer anderen Klassendefinition erscheinen darf (mit anderen Worten, von ihr kann nicht abgeleitet werden). Das Programm ist andernfalls fehlerhaft (ein Kompilierungsfehler wird generiert). final kann auch mit einer `union`-Definition verwendet werden, in diesem Fall hat es keine Auswirkung (außer auf das Ergebnis von std::is_final)(seit C++14), da von Unions nicht abgeleitet werden kann.

[edit] replaceable_if_eligible-Spezifizierer

replaceable_if_eligible gibt an, dass diese Klasse ersetzbar  ist, wenn sie ersetzungsberechtigt  ist.

[edit] trivially_relocatable_if_eligible-Spezifizierer

trivially_relocatable_if_eligible gibt an, dass diese Klasse trivial umzugruppierbar  ist, wenn sie berechtigt zur trivialen Umzugsgruppierung  ist.

[edit] Ersetzbarkeit

Eine Klasse C ist ersetzbar , wenn sie ersetzungsberechtigt  ist und entweder

  • den replaceable_if_eligible class-prop-specifier hat
  • eine union ohne benutzerdefinierte spezielle Memberfunktionen ist
  • standardmäßig umzugruppierbar  ist.

[edit] Berechtigung zur Ersetzung

Eine Klasse C ist ersetzungsberechtigt , es sei denn, sie

  • hat eine Basisklasse, die keine ersetzbare  Klasse ist
  • hat einen nicht-statischen Datenmember, der keinen ersetzbaren  Typ hat
  • die Auflösung der Überladung fehlschlägt oder einen gelöschten Konstruktor auswählt, wenn ein Objekt vom Typ C aus einem xvalue vom Typ C direkt initialisiert wird
  • die Auflösung der Überladung fehlschlägt oder eine gelöschte Zuweisungsoperatorfunktion auswählt, wenn an ein lvalue vom Typ C aus einem xvalue vom Typ C zugewiesen wird
  • hat einen gelöschten Destruktor.

[edit] Triviale Umzugsgruppierbarkeit

Eine Klasse ist trivial umzugruppierbar , wenn sie berechtigt zur trivialen Umzugsgruppierung  ist und entweder

  • den trivially_relocatable_if_eligible class-prop-specifier hat
  • eine union ohne benutzerdefinierte spezielle Memberfunktionen ist
  • standardmäßig umzugruppierbar  ist.

[edit] Berechtigung zur trivialen Umzugsgruppierung

Eine Klasse ist berechtigt zur trivialen Umzugsgruppierung , es sei denn, sie hat entweder

mit der Ausnahme, dass es implementierungsabhängig ist, ob eine ansonsten berechtigte union mit einem oder mehreren Unterobjekten vom polymorphen Klassentyp berechtigt zur trivialen Umzugsgruppierung  ist.

[edit] Standard-Umzugsfähigkeit

Eine Klasse C ist standardmäßig umzugruppierbar , wenn alle folgenden Bedingungen erfüllt sind

  • die Auflösung der Überladung für die direkte Initialisierung eines Objekts vom Typ C aus einem xvalue vom Typ C einen Konstruktor auswählt, der ein direktes Member von C ist und weder benutzerdefiniert noch gelöscht ist
  • die Auflösung der Überladung für die Zuweisung an ein lvalue vom Typ C aus einem xvalue vom Typ C eine Zuweisungsoperatorfunktion auswählt, die ein direktes Member von C ist und weder benutzerdefiniert noch gelöscht ist
  • C hat einen Destruktor, der weder benutzerdefiniert noch gelöscht ist.

[edit] Schlüsselwörter

final, replaceable_if_eligible, trivially_relocatable_if_eligible.

[edit] Hinweis

  • Nicht alle TriviallyCopyable-Klassen sind ersetzbar  oder trivial umzugruppierbar .
  • Zugänglichkeit der speziellen Memberfunktionen wird bei der Feststellung der trivialen Umzugsgruppierbarkeit  oder Ersetzbarkeit  nicht berücksichtigt.
  • Eine Klasse mit const-qualifizierten oder Referenz-nicht-statischen Datenmembern kann trivial umzugruppierbar  sein.
  • unions ohne benutzerdefinierte spezielle Memberfunktionen und standardmäßig umzugruppierbare  Klassen sind sowohl ersetzbar  als auch trivial umzugruppierbar , auch wenn sie ohne Klasseneigenschafts-Spezifizierer definiert werden.
Feature-Testmakro Wert Std Feature
__cpp_trivial_relocatability 202502L (C++26) Triviale Umzugsgruppierbarkeit

[edit] Beispiel

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() {}

[edit] Referenzen

  • C++26 Standard (ISO/IEC 14882:2026)
  • 6.8.1 Trivially relocatable and replaceable types [basic.types.general]

[edit] Siehe auch

final-Spezifizierer (C++11) deklariert, dass eine Methode nicht überschrieben werden kann oder eine Klasse nicht von ihr abgeleitet werden kann[bearbeiten]
(C++14)
prüft, ob ein Typ ein finaler Klassentyp ist
(Klassenvorlage) [bearbeiten]