Maison > développement back-end > C++ > Pourquoi l'initialisation d'agrégat échoue-t-elle avec des constructeurs explicitement par défaut ou supprimés dans C 20 ?

Pourquoi l'initialisation d'agrégat échoue-t-elle avec des constructeurs explicitement par défaut ou supprimés dans C 20 ?

DDD
Libérer: 2024-11-02 18:24:30
original
235 Les gens l'ont consulté

Why Does Aggregate Initialization Fail with Explicitly Defaulted or Deleted Constructors in C  20?

Pourquoi l'initialisation de l'agrégat échoue avec des constructeurs explicitement par défaut ou supprimés en C 20

En C 20, l'initialisation de l'agrégat des structures avec des constructeurs explicitement par défaut ou supprimés les constructeurs ne sont plus pris en charge. Ce changement est le résultat d'une révision de la norme C. Avant C 20, l'initialisation globale était autorisée pour les structures qui n'avaient pas de constructeurs ou qui n'avaient que des constructeurs explicitement par défaut ou supprimés. Cependant, en C 20, la norme a été mise à jour pour indiquer que l'initialisation globale n'est autorisée que pour les structures sans constructeurs déclarés ou hérités par l'utilisateur.

Raisonnement derrière le changement

Le changement a été introduit pour résoudre le problème du comportement d'initialisation inattendu et déroutant. Dans les versions antérieures de C , les constructeurs explicitement par défaut ou supprimés pouvaient permettre l'initialisation globale, même lorsque cela n'était pas prévu. Cela pourrait entraîner des conversions et des erreurs inattendues. En éliminant l'initialisation globale dans ces cas, la norme garantit que l'initialisation se produit toujours via le(s) constructeur(s), ce qui entraîne un comportement cohérent et prévisible.

Exemple

Avant C 20, le code suivant aurait été compilé sans erreur :

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

auto test = Foo { 0 }; // Aggregate initialization</code>
Copier après la connexion

Cependant, en C 20, le même code génère une erreur de compilation, car le constructeur est explicitement défini par défaut et l'initialisation globale n'est plus autorisée. Pour résoudre le problème, le constructeur explicitement par défaut peut être supprimé ou l'initialisation peut être effectuée explicitement à l'aide du constructeur :

<code class="cpp">auto test = Foo(0); // Constructor initialization</code>
Copier après la connexion

Impact sur les pratiques de codage

Alors qu'explicitement La suppression ou la suppression de constructeurs par défaut était auparavant considérée comme une bonne pratique, le changement de la norme C 20 suggère que cela n'est plus bénéfique. Dans C 20 et les versions ultérieures, il est recommandé de s'appuyer sur le comportement implicite des constructeurs par défaut et d'éviter de définir ou de supprimer explicitement des constructeurs, sauf s'il existe une raison spécifique de le faire.

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