Maison > développement back-end > C++ > Pourquoi l'initialisation d'agrégat n'est-elle plus autorisée pour les structures avec des constructeurs explicitement par défaut ou supprimés dans C 20 ?

Pourquoi l'initialisation d'agrégat n'est-elle plus autorisée pour les structures avec des constructeurs explicitement par défaut ou supprimés dans C 20 ?

Patricia Arquette
Libérer: 2024-11-03 08:29:30
original
736 Les gens l'ont consulté

Why Is Aggregate Initialization No Longer Allowed for Structs with Explicitly Defaulted or Deleted Constructors in C  20?

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal