Maison > développement back-end > C++ > Pourquoi C 20 interdit-il l'initialisation globale des structures avec des constructeurs déclarés par l'utilisateur ?

Pourquoi C 20 interdit-il l'initialisation globale des structures avec des constructeurs déclarés par l'utilisateur ?

DDD
Libérer: 2024-11-02 12:29:02
original
543 Les gens l'ont consulté

Why Does C  20 Prohibit Aggregate Initialization for Structs with User-Declared Constructors?

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal