Maison  >  Article  >  développement back-end  >  Pourquoi gcc et clang nécessitent-ils un initialiseur de membre par défaut même avec un constructeur par défaut ?

Pourquoi gcc et clang nécessitent-ils un initialiseur de membre par défaut même avec un constructeur par défaut ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 06:46:02236parcourir

Why Does gcc and clang Require a Default Member Initializer Even with a Default Constructor?

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

Lors de la tentative de compilation du code ci-dessous avec gcc8.2 et clang7.0, les utilisateurs peuvent rencontrer le message d'erreur suivant :

default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class

Cette erreur se produit en raison d'un problème subtil avec l'initialiseur de membre par défaut pour la variable numOfMaxEasyHandles dans la structure Hints de la classe Downloader.

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
        //Hints(){}          // <= if I uncomment this all works gcc+clang+msvc
        //Hints() = default; // <= if I uncomment this neither clang no gcc works (msvc - works)
    };
};</code>

La source sous-jacente de l'erreur :

Si le constructeur par défaut Hints() pour la structure Hints n'est pas commenté, le message d'erreur disparaît. Cependant, si le constructeur par défaut est remplacé par Hints() = default;, l'erreur persiste dans gcc et clang.

Ce comportement est un bug connu dans gcc et clang. Dans de tels scénarios, le compilateur exige que l'initialiseur de membre par défaut pour numOfMaxEasyHandles soit défini dans la définition de la structure elle-même, même si le constructeur par défaut est présent.

Comportement de MSVC :

En revanche, MSVC2017 ne présente pas cette erreur et permet au code de se compiler sans aucun problème. En effet, MSVC gère les initialiseurs de membres par défaut différemment de gcc et clang.

Solution de contournement :

Pour résoudre l'erreur dans gcc et clang, on peut simplement définir le membre par défaut initialiseur dans la définition de la structure :

<code class="cpp">struct Hints
{       
    int32_t numOfMaxEasyHandles = 8;
};</code>

Avec cette modification, le code devrait être compilé avec succès dans les trois compilateurs.

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