Maison > développement back-end > C++ > Pourquoi GCC et Clang lancent-ils « Initialiseur de membre par défaut requis » lors de l'utilisation d'une classe comme argument par défaut ?

Pourquoi GCC et Clang lancent-ils « Initialiseur de membre par défaut requis » lors de l'utilisation d'une classe comme argument par défaut ?

Barbara Streisand
Libérer: 2024-10-26 10:49:02
original
581 Les gens l'ont consulté

Why Does GCC and Clang Throw

Comprendre l'erreur du compilateur : « Initialiseur de membre par défaut requis avant la fin de sa classe englobante »

Ce problème survient lors de la tentative de définition d'un initialiseur de membre par défaut pour un membre de classe dans une fonction qui utilise cette classe comme valeur d'argument par défaut. Les compilateurs comme gcc et clang rencontrent des difficultés avec cette construction, tandis que msvc2017 la gère avec succès.

Considérez l'extrait de code suivant :

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &amp;hints = Hints());
};</code>
Copier après la connexion

Le code fourni vise à définir une valeur par défaut pour numOfMaxEasyHandles membre de la structure Hints, qui est utilisé comme argument par défaut dans la fonction Create. Cependant, gcc et clang ne parviennent pas à compiler ce code, émettant l'erreur :

default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
Copier après la connexion

Raison de l'erreur

Cette erreur se produit en raison d'un bug dans gcc et clang relatif à la gestion des initialiseurs de membres par défaut dans les classes qui sont utilisées comme arguments par défaut dans les fonctions. Les compilateurs s'attendent à ce que l'initialiseur de membre par défaut soit défini dans la définition de classe elle-même, plutôt que dans le corps de la fonction.

Solutions de contournement possibles

Pour résoudre ce problème, il existe deux solutions de contournement potentielles :

  1. Décommenter Hints(){} : L'ajout d'un constructeur vide à la structure Hints atténue l'erreur du compilateur. Cependant, cette approche peut ne pas être souhaitable car elle va à l'encontre de l'objectif d'avoir un initialiseur de membre par défaut.
  2. Utilisation de Hints() = default :Cette instruction définit explicitement un constructeur par défaut pour la structure Hints. . Bien qu'il élimine l'erreur du compilateur dans msvc2017, il rend le code incompatible avec gcc et clang en raison de leur bug susmentionné.

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