Heim > Backend-Entwicklung > C++ > Hauptteil

Warum erfordern gcc und clang einen Standard-Member-Initialisierer, selbst mit einem Standardkonstruktor?

Barbara Streisand
Freigeben: 2024-10-28 06:46:02
Original
233 Leute haben es durchsucht

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

Compiler-Fehler verstehen: „Standard-Member-Initialisierer vor Ende der Klasse erforderlich“

Beim Versuch, den folgenden Code mit gcc8.2 und zu kompilieren clang7.0 erhalten Benutzer möglicherweise die folgende Fehlermeldung:

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

Dieser Fehler tritt aufgrund eines subtilen Problems mit dem Standard-Member-Initialisierer für die Variable numOfMaxEasyHandles in der Hints-Struktur der Downloader-Klasse auf.

<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>
Nach dem Login kopieren

Die zugrunde liegende Fehlerquelle:

Wenn der Standardkonstruktor Hints() für die Hints-Struktur unkommentiert ist, verschwindet die Fehlermeldung. Wenn jedoch der Standardkonstruktor durch Hints() = default; ersetzt wird, bleibt der Fehler in gcc und clang bestehen.

Dieses Verhalten ist ein bekannter Fehler sowohl in gcc als auch in clang. In solchen Szenarien erfordert der Compiler, dass der Standard-Member-Initialisierer für numOfMaxEasyHandles in der Definition der Struktur selbst definiert wird, auch wenn der Standardkonstruktor vorhanden ist.

Verhalten von MSVC:

Im Gegensatz dazu weist MSVC2017 diesen Fehler nicht auf und ermöglicht die problemlose Kompilierung des Codes. Dies liegt daran, dass MSVC Standardmitgliedsinitialisierer anders behandelt als gcc und clang.

Problemumgehung:

Um den Fehler in gcc und clang zu beheben, kann man einfach das Standardmitglied definieren Initialisierer innerhalb der Strukturdefinition:

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

Mit dieser Änderung sollte der Code in allen drei Compilern erfolgreich kompiliert werden.

Das obige ist der detaillierte Inhalt vonWarum erfordern gcc und clang einen Standard-Member-Initialisierer, selbst mit einem Standardkonstruktor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!