Rupture de l'initialisation des agrégats : impact des modifications du C 20
Depuis le passage du C 17 au C 20, l'initialisation des agrégats a subi un changement important lorsque les constructeurs explicites sont définis par défaut ou supprimés. Dans cet article, nous approfondissons le raisonnement derrière cette modification et explorons ses implications.
Origine du changement
Auparavant, en C 17, l'initialisation globale était autorisée pour des structures avec des constructeurs explicitement par défaut ou supprimés. Cependant, avec l'adoption de C 20, la norme C a été révisée pour interdire l'initialisation globale des structures avec des constructeurs déclarés par l'utilisateur, y compris ceux par défaut ou supprimés.
Justification
La principale motivation derrière ce changement réside dans la résolution des incohérences potentielles et de la confusion dans l'initialisation globale. Le comité des standards a reconnu qu'autoriser l'initialisation globale des structures avec des constructeurs déclarés par l'utilisateur, même ceux par défaut ou supprimés, entraînait un comportement inattendu et souvent erroné.
Considérez l'exemple suivant :
<code class="cpp">struct Foo { Foo() = default; int bar; }; int main() { Foo test = { 0 }; // Error: Cannot initialize due to defaulted constructor }</code>
Dans ce cas, le constructeur par défaut est explicitement fourni, même s'il n'a essentiellement aucun effet sur l'initialisation de la structure. Cependant, autoriser l'initialisation globale dans ce scénario pourrait contourner le constructeur, ce qui pourrait conduire à un comportement indéfini ou à des incohérences.
Impact sur les pratiques des développeurs
Le changement dans les pratiques d'initialisation globale a a modifié l'approche recommandée pour la structuration et l'initialisation des classes et des structures. Auparavant, il était courant d'utiliser explicitement les constructeurs par défaut pour améliorer la lisibilité du code et garantir une syntaxe plus propre. Cependant, avec le standard actuel, il n'est plus conseillé d'utiliser des constructeurs par défaut pour les classes ou les structures qui nécessitent une initialisation.
Conclusion
La modification pour agréger l'initialisation en C 20 a été conçu pour améliorer la clarté, la cohérence et la sécurité du code. En interdisant l'initialisation globale des structures avec des constructeurs déclarés par l'utilisateur, la norme vise à éliminer les pièges potentiels et à améliorer la fiabilité globale des bases de code. Les développeurs doivent ajuster leurs pratiques en conséquence pour s'aligner sur ces changements, conduisant à des applications C plus robustes et maintenables.
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!