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
DDDoriginal
2024-11-02 12:29:02583parcourir

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>

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!

Déclaration:
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