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
DDDoriginal
2024-10-29 08:04:02799parcourir

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>

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>

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>

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!

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