Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erfordern gcc und clang einen Standard-Member-Initialisierer, selbst mit einem Standardkonstruktor?

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-28 06:46:02236Durchsuche

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

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>

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>

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!

Stellungnahme:
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