Maison  >  Article  >  développement back-end  >  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
Barbara Streisandoriginal
2024-10-26 10:49:02497parcourir

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>

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

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!

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