class property specifiers (since C++26)
Gibt an, dass eine Klasse ersetzbar ist ( replaceable_if_eligible ), trivial verschiebbar ist ( trivially_relocatable_if_eligible ), oder dass von einer Klasse nicht abgeleitet werden kann ( final ).
Inhaltsverzeichnis |
Syntax
Klasseneigenschafts-Spezifizierer erscheinen am Anfang der Klassendefinition, unmittelbar nach dem Namen der Klasse, und können 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 s, aber jeder kann höchstens einmal vorkommen. |
| class-prop-specifier | - | einer von final , replaceable_if_eligible und trivially_relocatable_if_eligible . |
Vor
(C++26)
gab es den
class-virt-specifier
(optional)
anstelle von
class-prop-specifier-seq
(optional)
, der nur
final
für den
final
specifier
(since C++11)
erlaubte.
Erklärung
final , replaceable_if_eligible und trivially_relocatable_if_eligible sind Bezeichner mit einer speziellen Bedeutung, wenn sie im Klassenkopf verwendet werden. In anderen Kontexten sind sie nicht reserviert und können zur Benennung von Objekten und Funktionen verwendet werden.
final Spezifizierer
final spezifiziert, dass diese Klasse nicht in der base-specifier-list einer anderen Klassendefinition erscheinen darf (mit anderen Worten, kann nicht abgeleitet werden). Das Programm ist andernfalls fehlerhaft (es wird ein Compile-Time-Fehler generiert). final kann auch mit einer union -Definition verwendet werden, in welchem Fall es keine Auswirkung hat (außer auf das Ergebnis von std::is_final ) (seit C++14) , da von Unions nicht abgeleitet werden kann.
replaceable_if_eligible Spezifizierer
replaceable_if_eligible spezifiziert, dass diese Klasse ersetzbar ist, falls sie für Ersetzung geeignet ist.
trivially_relocatable_if_eligible Spezifizierer
trivially_relocatable_if_eligible spezifiziert, dass diese Klasse trivial relokierbar ist, falls sie für triviale Relokation geeignet ist.
Austauschbarkeit
Eine Klasse
C
ist
austauschbar
, wenn sie
für Austausch geeignet
ist und entweder:
- hat den replaceable_if_eligible class-prop-specifier
-
ist eine
unionohne benutzerdefinierte spezielle Elementfunktionen - ist standardmäßig verschiebbar .
Berechtigung für Ersatz
Eine Klasse
C
ist
ersetzbar
es sei denn, einer der folgenden Fälle trifft zu:
- es hat eine Basisklasse , die keine replaceable -Klasse ist
- es hat ein nicht-statisches Datenelement , das nicht von einem replaceable -Typ ist
-
Überladungsauflösung schlägt fehl oder wählt einen gelöschten Konstruktor aus, wenn
Direktinitialisierung
eines Objekts vom Typ
Caus einem X-Wert vom TypCdurchgeführt wird -
Überladungsauflösung schlägt fehl oder wählt eine gelöschte Zuweisungsoperatorfunktion aus, wenn einer
L-Wert
vom Typ
Cein X-Wert vom TypCzugewiesen wird - es hat einen gelöschten Destruktor .
Triviale Relokationsfähigkeit
Eine Klasse ist trivially relocatable wenn sie eligible for trivial relocation ist und entweder:
- hat die trivially_relocatable_if_eligible class-prop-specifier
-
ist eine
unionohne benutzerdefinierte spezielle Elementfunktionen - ist standardmäßig verschiebbar .
Berechtigung für triviale Verlagerung
Eine Klasse ist für triviale Verschiebung geeignet es sei denn, sie hat entweder:
- jede virtuelle Basisklasse
- eine Basisklasse , die keine trivial relokierbare Klasse ist
- ein nicht-statisches Datenelement eines Objekttyps, der kein trivial relokierbarer Typ ist
- ein gelöschter Destruktor
außer dass implementierungsdefiniert ist, ob eine ansonsten geeignete
union
mit einem oder mehreren Unterobjekten polymorphen Klassentyps
für triviale Relokation geeignet ist
.
Standardmäßige Beweglichkeit
Eine Klasse
C
ist
default movable
, wenn alle folgenden Bedingungen erfüllt sind:
-
Überladungsauflösung für
direkte Initialisierung
eines Objekts vom Typ
Caus einem X-Wert vom TypCwählt einen Konstruktor aus, der ein direktes Mitglied vonCist und weder benutzerbereitgestellt noch gelöscht ist -
Überladungsauflösung für die Zuweisung an einen
L-Wert
vom Typ
Cvon einem X-Wert vom TypCwählt eine Zuweisungsoperatorfunktion aus, die ein direktes Mitglied vonCist und weder benutzerbereitgestellt noch gelöscht ist -
Chat einen Destruktor der weder benutzerbereitgestellt noch gelöscht ist.
Schlüsselwörter
final , replaceable_if_eligible , trivially_relocatable_if_eligible .
Hinweis
- Nicht alle TriviallyCopyable -Klassen sind ersetzbar oder trivial relocatable .
- Zugänglichkeit der speziellen Elementfunktionen wird bei der Feststellung von trivialer Relocatability oder Replaceability nicht berücksichtigt.
- Eine Klasse mit const-qualifizierten oder Referenz- nicht-statischen Datenelementen kann trivial relocatable sein.
-
unions ohne benutzerdefinierte spezielle Elementfunktionen und default movable -Klassen sind sowohl ersetzbar als auch trivial relocatable , selbst wenn sie ohne Klassen-Eigenschafts-Spezifizierer definiert sind.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_trivial_relocatability
|
202502L
|
(C++26) | Triviale Relokalisierbarkeit |
Beispiel
struct final; // OK; deklariert eine Klasse namens 'final', // verwendet keine Klassen-Eigenschafts-Spezifizierer. struct IF final; // Ungültig: Klassen-Eigenschafts-Spezifizierer // können nicht in Funktionsdeklarationen erscheinen. struct F final {}; // OK; Spezifizierer markiert Klasse F als nicht ableitbar. struct D: F {}; // Ungültig: Von Klasse F kann nicht abgeleitet werden. // OK; Spezifizierer markiert Klasse R als 𝘦𝘳𝘴𝘦𝘵𝘻𝘣𝘢𝘳 falls geeignet. struct R replaceable_if_eligible {}; // OK; Spezifizierer markiert Klasse T als 𝘵𝘳𝘪𝘷𝘪𝘢𝘭 𝘷𝘦𝘳𝘭𝘢𝘨𝘦𝘳𝘣𝘢𝘳 falls geeignet. struct T trivially_relocatable_if_eligible {}; // OK; eine Klasse kann mit mehreren Klassen-Eigenschafts-Spezifizierern markiert werden. struct FRT final replaceable_if_eligible trivially_relocatable_if_eligible {}; // Ungültig: jeder Klassen-Eigenschafts-Spezifizierer kann höchstens einmal erscheinen. struct FRF final replaceable_if_eligible final {}; int main() {}
Referenzen
- C++26-Standard (ISO/IEC 14882:2026):
-
- 6.8.1 Trivial relocatable und ersetzbare Typen [basic.types.general]
Siehe auch
final
Spezifizierer
(C++11)
|
deklariert, dass eine Methode nicht überschrieben oder eine Klasse nicht abgeleitet werden kann |
|
(C++14)
|
prüft, ob ein Typ ein finaler Klassentyp ist
(Klassentemplate) |