Maison > développement back-end > C++ > Pourquoi l'erreur « Initialiseur de membre par défaut requis avant la fin de la classe » se produit-elle lors de l'utilisation d'un constructeur non trivial comme argument par défaut ?

Pourquoi l'erreur « Initialiseur de membre par défaut requis avant la fin de la classe » se produit-elle lors de l'utilisation d'un constructeur non trivial comme argument par défaut ?

DDD
Libérer: 2024-10-29 08:04:02
original
798 Les gens l'ont consulté

Why Does

Comprendre l'erreur du compilateur « Initialiseur de membre par défaut requis avant la fin du cours »

Dans cet extrait de code :

<code class="cpp">#include <cassert>
#include <iostream>
#include <cstdlib>

class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &hints = Hints());
};

Downloader* Downloader::Create(const Hints &hints)
{
    std::cout << hints.numOfMaxEasyHandles << std::endl;
    return nullptr;
}</code>
Copier après la connexion

Le message d'erreur "initialiseur de membre par défaut requis avant la fin de sa classe englobante" est généré par les compilateurs Clang et GCC lors de la tentative de définition d'un argument par défaut qui construit une instance de la structure Hints.

Raison pour l'Erreur

Cette erreur se produit car l'argument par défaut de la fonction Create est un constructeur non trivial, qui nécessite qu'un initialiseur de membre par défaut soit défini dans la déclaration de la structure Hints. Sans l'initialiseur de membre, le compilateur est incapable de déterminer les valeurs initiales du membre numOfMaxEasyHandles lorsqu'un argument par défaut est utilisé.

Solution

Pour résoudre le problème, le La structure Hints doit inclure un initialiseur de membre par défaut, comme suit :

<code class="cpp">struct Hints
{       
    int32_t numOfMaxEasyHandles = 8;
    Hints() {}  // Default member initializer
};</code>
Copier après la connexion

Avec l'initialiseur de membre par défaut en place, Clang et GCC pourront compiler le code avec succès. Notez que la structure Hints doit définir un constructeur par défaut explicite pour que cette solution fonctionne.

GCC et Clang Bug

On peut remarquer que la ligne suivante :

<code class="cpp">Hints() = default;</code>
Copier après la connexion

ne résout pas le problème pour Clang et GCC. Il s'agit d'un bug connu dans ces compilateurs, où les initialiseurs de membres par défaut pour les constructeurs non triviaux ne sont pas reconnus correctement dans certains contextes, par exemple lorsque le constructeur est utilisé comme argument par défaut.

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