Pourquoi les constructeurs explicites par défaut ou supprimés empêchent l'initialisation de l'agrégat dans C 20
C 20 introduit un changement qui affecte l'initialisation de l'agrégat. Auparavant, les structures autorisées pouvaient avoir des constructeurs explicitement par défaut ou supprimés. Cependant, ce n'est plus le cas.
Raisonnement
Le changement est motivé par la volonté d'améliorer la sémantique d'initialisation en C et de la rendre plus cohérente. Autoriser l'initialisation globale avec des constructeurs explicitement par défaut ou supprimés pourrait conduire à un comportement confus et inattendu.
Par exemple, considérons le code suivant :
<code class="cpp">struct X { int i{4}; X() = default; }; int main() { X x1(3); // ill-formed - no matching c’tor X x2{3}; // compiles! }</code>
En C 17, x2 initialiserait le membre i variable à 3. Cependant, ce comportement était incompatible avec les constructeurs définis par l'utilisateur. Ce changement résout cette incohérence.
Solutions alternatives
Pour résoudre l'erreur, les constructeurs explicitement par défaut ou supprimés ne doivent pas être utilisés pour les types d'agrégats. Envisagez plutôt d'omettre le constructeur ou d'utiliser un constructeur défini par l'utilisateur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!