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>
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>
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!