Klasseneigenschafts-Spezifizierer (seit C++26)
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
unionohne 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
Caus einem xvalue vom TypCdirekt initialisiert wird - die Auflösung der Überladung fehlschlägt oder eine gelöschte Zuweisungsoperatorfunktion auswählt, wenn an ein lvalue vom Typ
Caus einem xvalue vom TypCzugewiesen 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
unionohne 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
- irgendwelche virtuellen Basisklassen
- eine Basisklasse, die keine trivial umzugruppierbare Klasse ist
- einen nicht-statischen Datenmember eines Objekttyps, der keinen trivial umzugruppierbaren Typ hat
- einen gelöschten Destruktor
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
Caus einem xvalue vom TypCeinen Konstruktor auswählt, der ein direktes Member vonCist und weder benutzerdefiniert noch gelöscht ist - die Auflösung der Überladung für die Zuweisung an ein lvalue vom Typ
Caus einem xvalue vom TypCeine Zuweisungsoperatorfunktion auswählt, die ein direktes Member vonCist und weder benutzerdefiniert noch gelöscht ist -
Chat 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 |
| (C++14) |
prüft, ob ein Typ ein finaler Klassentyp ist (Klassenvorlage) |