Namespaces
Variants

class property specifiers (since C++26)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Spécifie qu'une classe est remplaçable ( replaceable_if_eligible ), trivialement relogeable ( trivially_relocatable_if_eligible ), ou qu'une classe ne peut pas être dérivée ( final ).

Table des matières

Syntaxe

Spécificateurs de propriété de classe apparaissent au début de la définition de la classe, immédiatement après le nom de la classe, et ne peuvent pas apparaître dans une déclaration de classe.

class-key attr  (optionnel) class-head-name class-prop-specifier-seq  (optionnel) base-clause  (optionnel)
class-prop-specifier-seq - un ou plusieurs class-prop-specifier s, mais chacun ne peut apparaître qu'au plus une fois.
class-prop-specifier - l'un de final , replaceable_if_eligible et trivially_relocatable_if_eligible .

Avant (C++26) , il y avait le class-virt-specifier  (optionnel) à la place de class-prop-specifier-seq  (optionnel) , qui ne permettait que le final pour final specifier (depuis C++11) .

Explication

final , replaceable_if_eligible et trivially_relocatable_if_eligible sont des identifiants ayant une signification particulière lorsqu'ils sont utilisés dans l'en-tête d'une classe. Dans d'autres contextes, ils ne sont pas réservés et peuvent être utilisés pour nommer des objets et des fonctions.

final spécificateur

final spécifie que cette classe ne peut pas apparaître dans la base-specifier-list d'une autre définition de classe (en d'autres termes, ne peut pas être dérivée). Le programme est mal formé dans le cas contraire (une erreur de compilation est générée). final peut également être utilisé avec une définition union , auquel cas il n'a aucun effet (autre que sur le résultat de std::is_final ) (depuis C++14) , car les unions ne peuvent pas être dérivées.

replaceable_if_eligible spécificateur

replaceable_if_eligible spécifie que cette classe est remplaçable  si elle est éligible au remplacement  .

trivially_relocatable_if_eligible spécificateur

trivially_relocatable_if_eligible spécifie que cette classe est trivialement relogeable  si elle est éligible pour la relocation triviale  .

Remplaçabilité

Une classe C est remplaçable  si elle est éligible au remplacement  et soit :

Admissibilité au remplacement

Une classe C est éligible au remplacement sauf si l'une des conditions suivantes est remplie :

Relocalisation triviale

Une classe est trivialement relogeable  si elle est éligible à la relocation triviale  et soit :

Éligibilité pour la relocation triviale

Une classe est éligible pour la relocation triviale  sauf si elle possède l'une des caractéristiques suivantes :

sauf qu'il est défini par l'implémentation si une union autrement éligible ayant un ou plusieurs sous-objets de type classe polymorphe est éligible pour la relocation triviale  .

Mobilité par défaut

Une classe C est déplaçable par défaut si toutes les conditions suivantes sont remplies :

  • la résolution de surcharge pour l'initialisation directe d'un objet de type C à partir d'une xvalue de type C sélectionne un constructeur qui est un membre direct de C et qui n'est ni fourni par l'utilisateur ni supprimé
  • la résolution de surcharge pour l'affectation à une lvalue de type C à partir d'une xvalue de type C sélectionne une fonction d'opérateur d'affectation qui est un membre direct de C et qui n'est ni fournie par l'utilisateur ni supprimée
  • C a un destructeur qui n'est ni fourni par l'utilisateur ni supprimé.

Mots-clés

final , replaceable_if_eligible , trivially_relocatable_if_eligible .

Remarque

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_trivial_relocatability 202502L (C++26) Déplaçabilité triviale

Exemple

struct final;      // OK; déclare une classe nommée 'final',
                   // n'utilise pas les spécificateurs de propriété de classe.
struct IF final;   // Mal formé : les spécificateurs de propriété de classe
                   // ne peuvent pas apparaître dans la déclaration de fonction.
struct F final {}; // OK; le spécificateur marque la classe F comme non dérivable.
struct D: F {};    // Mal formé : la classe F ne peut pas être dérivée.
// OK; le spécificateur marque la classe R comme 𝘳𝘦𝘮𝘱𝘭𝘢ç𝘢𝘣𝘭𝘦 si éligible.
struct R replaceable_if_eligible {};
// OK; le spécificateur marque la classe T comme 𝘵𝘳𝘪𝘷𝘪𝘢𝘭𝘦𝘮𝘦𝘯𝘵 𝘳𝘦𝘭𝘰𝘤𝘢𝘵𝘢𝘣𝘭𝘦 si éligible.
struct T trivially_relocatable_if_eligible {};
// OK; une classe peut être marquée avec plusieurs spécificateurs de propriété de classe.
struct FRT final replaceable_if_eligible trivially_relocatable_if_eligible {};
// Mal formé : chaque spécificateur de propriété de classe ne peut apparaître qu'une seule fois.
struct FRF final replaceable_if_eligible final {};
int main() {}

Références

  • Norme C++26 (ISO/CEI 14882:2026) :
  • 6.8.1 Types trivialement déplaçables et remplaçables [basic.types.general]

Voir aussi

final spécificateur (C++11) déclare qu'une méthode ne peut pas être redéfinie ou qu'une classe ne peut pas être dérivée
(C++14)
vérifie si un type est un type de classe final
(modèle de classe)