Initialisation d'agrégat en C 20
En C 20, l'initialisation d'agrégat pour les structures qui ont explicitement des constructeurs par défaut ou supprimés a subi un changement important. Cette modification affecte le code qui était auparavant valide mais génère désormais des erreurs.
Compatibilité pré-C 20
Avant C 20, l'initialisation globale était autorisée pour les structures possédant l'utilisateur- constructeurs fournis, hérités ou explicitement par défaut ou supprimés. Cela permettait de contourner les constructeurs lors de l'initialisation.
Normes C 20
Cependant, la norme C 20 a révisé ce comportement. L'initialisation globale est désormais autorisée uniquement pour les structures dépourvues de constructeurs déclarés ou hérités par l'utilisateur. Les constructeurs explicitement par défaut ou supprimés ne sont plus autorisés. Ce changement a été mis en œuvre pour résoudre l'ambiguïté et la confusion dans la sémantique d'initialisation.
Justification du changement
La justification de ce changement dans les normes C est enracinée dans le désir d'améliorer la sécurité, l'uniformité et la clarté de l'initialisation. Le comportement précédent pourrait conduire à un code inattendu et erroné, comme illustré par :
struct X { int i{4}; X() = default; }; int main() { X x1(3); // ill-formed - no matching c’tor X x2{3}; // compiles! }
Dans cet exemple, le constructeur par défaut de X ne peut pas être utilisé pour l'initialisation en raison de la déclaration de la variable membre i avec une initiale valeur de 4. Cependant, l'initialisation globale est autorisée par erreur, conduisant à un comportement ambigu et potentiellement incorrect.
Implications pour le code
Ce changement nécessite des modifications de code pour les cas où l'initialisation globale est l'initialisation était auparavant utilisée avec des constructeurs explicitement par défaut ou supprimés. Cela incite les développeurs à reconsidérer la pratique consistant à définir explicitement des constructeurs par défaut pour les types de données agrégées.
En conclusion, le changement de la norme C 20 concernant l'initialisation agrégée vise à améliorer la fiabilité et la cohérence des idiomes d'initialisation, justifiant ainsi l'éventuelle incompatibilité ascendante. il présente.
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!