Maison >développement back-end >C++ >L'initialisation globale est-elle toujours possible pour les structures avec des constructeurs explicitement par défaut ou supprimés dans C 20 ?

L'initialisation globale est-elle toujours possible pour les structures avec des constructeurs explicitement par défaut ou supprimés dans C 20 ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-04 13:43:02973parcourir

Is Aggregate Initialization Still Possible for Structs with Explicitly Defaulted or Deleted Constructors in C  20?

Impact de la valeur par défaut et de la suppression explicite du constructeur sur l'initialisation de l'agrégat en C 20

Depuis l'introduction de C 20, il y a eu un changement notable dans le comportement de l'initialisation globale lorsque les constructeurs sont explicitement définis par défaut ou supprimés. Dans cette discussion, nous étudierons les raisons de cette modification et ses implications pour les développeurs.

Le changement dans C 20

Avant C 20, l'initialisation globale était autorisée pour les structures avec des constructeurs fournis par l'utilisateur, tant que ces constructeurs n'ont pas été explicitement définis par défaut ou supprimés. Cependant, en C 20, cette exception a été supprimée, ce qui signifie que les structures avec des constructeurs explicitement par défaut ou supprimés ne peuvent plus être initialisées à l'aide d'agrégats.

Raisonnement derrière le changement

Le changement dans C 20 a été introduit pour améliorer la sécurité et la cohérence de la sémantique d'initialisation. Plus précisément, le problème tourne autour de la confusion potentielle provoquée par la coexistence de l'initialisation globale et des constructeurs au sein de la même structure. Prenons l'exemple suivant :

<code class="cpp">struct Foo
{
    int bar;
    Foo() = default;
};

int main()
{
    Foo f { 0 }; // Error in C++20
}</code>

Dans cet exemple, la structure Foo a un constructeur explicitement par défaut. Avant C 20, ce code aurait été valide, avec une initialisation globale contournant le constructeur par défaut. Cependant, dans C 20, ce comportement est interdit pour empêcher l'utilisateur de contourner involontairement la logique d'initialisation cruciale.

Conséquences pour les développeurs

Le changement dans C 20 a supprimé un option précédemment disponible pour initialiser les structures avec des constructeurs. En conséquence, les développeurs qui se sont appuyés sur des constructeurs explicitement par défaut ou supprimés pour l'initialisation globale devront réévaluer leur approche.

Conclusion

La suppression de l'initialisation globale pour Les structures avec des constructeurs explicitement par défaut ou supprimés dans C 20 visent à améliorer la sécurité et la cohérence de l'initialisation. Bien que cela puisse présenter certains inconvénients pour les développeurs qui utilisaient auparavant cette technique, les avantages globaux d’une clarté et d’une fiabilité améliorées l’emportent sur les inconvénients. Les développeurs sont encouragés à adapter leur code pour s'aligner sur ce changement et à envisager des méthodes d'initialisation alternatives si nécessaire.

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