Conformément à la projet.types.de.base#10 éventuellement un type de classe qualifié cv qui possède toutes les propriétés suivantes :
Un type de classe éventuellement qualifié de cv qui possède toutes les propriétés suivantes :
(10.5.1) - il a un destructeur trivial,
(10.5.2) - il s'agit soit d'un type de fermeture, soit d'un type d'agrégat, soit il a au moins un constructeur constexpr ou un modèle de constructeur (éventuellement). au moins un constructeur constexpr ou un modèle de constructeur (éventuellement hérité d'une classe de base) qui n'est pas un constructeur de copie ou de déplacement,
(10.5.3) - s'il s'agit d'une union, au moins l'un de ses membres de données non statiques non statiques est de type littéral non volatil.
(10.5.4) - s'il n'est pas une union, tous ses membres de données non statiques et ses classes de base sont de types littéraux non statiques.
Question 1 : Pourquoi un destructeur ne peut pas être marqué comme constexpr ?
Parce que seuls les destructeurs triviaux sont qualifiés pour constexpr Voici la section pertinente de la norme projet
Un destructeur est trivial s'il n'est pas fourni par l'utilisateur et si :
(5.4) - le destructeur n'est pas virtuel,
(5.5) - toutes les classes de base directes de sa classe ont des destructeurs triviaux et triviaux, et
(5.6) - pour tous les membres de données non statiques de sa classe qui sont qui sont de type classe (ou tableau), chacune de ces classes a un destructeur destructeur trivial.
Sinon, le destructeur est non trivial.
Question 2 : Si je ne fournis pas de destructeur, le destructeur généré implicitement est-il constexpr ?
Oui, car le destructeur généré implicitement est de type trivial, il est donc qualifié pour constexpr.
Question 3 : Si je déclare un destructeur par défaut (~X() = default ;), est-il automatiquement constexpr ?
En effet, ce destructeur est déclaré par l'utilisateur et généré implicitement, il est donc qualifié pour constexpr.
Je ne suis pas en mesure de trouver une référence directe que seulement triviale destructors
sont qualifiés pour constexpr
mais si le destructeur n'est pas trivial alors il est certain que le type de classe n'est pas cv-qualified.
Donc c'est un peu implicite comme vous ne pouvez pas définir une destructor
para cv-qualified
classe.
Mise à jour de C++20
Depuis C++20, les destructeurs définis par l'utilisateur peuvent également être constexpr sous certaines conditions.
dcl.constexpr/3 :
La définition d'une fonction constexpr doit satisfaire aux exigences suivantes exigences suivantes :
- son type de retour (le cas échéant) doit être un type littéral ;
- chacun de ses types de paramètres doit être un type littéral ;
- il ne doit pas être une coroutine ([dcl.fct.def.coroutine]) ;
- si la fonction est un constructeur ou un destructeur, sa classe ne doit pas avoir de classes de base virtuelles ;
- son corps de fonction ne doit pas contenir ([stmt.pre])
- une instruction goto,
- une étiquette d'identification ([stmt.label]),
- définition d'une variable de type non littéral ou de durée de stockage statique ou filaire. de stockage.
0 votes
Pour (1), veuillez préciser si vous demandez où dans la norme il est dit qu'un destructeur ne peut pas être constexpr ; ou si vous demandez la justification de cette règle.
1 votes
@M.M Je suis principalement intéressé par l'endroit dans la norme où il est dit qu'un destructeur ne peut pas être constexpr, mais une justification de cette règle serait également agréable à connaître.
0 votes
Y a-t-il une raison pour laquelle
constexpr
serait utile sur un destructeur ? Je n'arrive pas à trouver un exemple convaincant où cela serait utile à un programme.0 votes
Un exemple serait d'essayer de sous-classer une structure avec un remplissage, de telle sorte que le remplissage soit optimisé (cf. stackoverflow.com/questions/24110347 ). Si vous ajoutez un dtor non par défaut à la structure de base (pour optimiser le rembourrage), votre classe dérivée ne pourra pas être constexpr, puisque son dtor ne sera pas constexpr.