Heim  >  Artikel  >  Backend-Entwicklung  >  Warum werfen GCC und Clang „Default Member Initializer Required“ aus, wenn sie eine Klasse als Standardargument verwenden?

Warum werfen GCC und Clang „Default Member Initializer Required“ aus, wenn sie eine Klasse als Standardargument verwenden?

Barbara Streisand
Barbara StreisandOriginal
2024-10-26 10:49:02497Durchsuche

Why Does GCC and Clang Throw

Verstehen des Compiler-Fehlers: „Standard-Member-Initialisierer vor dem Ende seiner umschließenden Klasse erforderlich“

Dieses Problem tritt auf, wenn versucht wird, a zu definieren Standard-Member-Initialisierer für ein Klassenmitglied innerhalb einer Funktion, die diese Klasse als Standardargumentwert verwendet. Compiler wie gcc und clang stoßen auf Schwierigkeiten mit diesem Konstrukt, während msvc2017 es erfolgreich verarbeitet.

Beachten Sie den folgenden Codeausschnitt:

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &amp;hints = Hints());
};</code>

Der bereitgestellte Code soll einen Standardwert für numOfMaxEasyHandles definieren Mitglied der Hints-Struktur, das als Standardargument in der Create-Funktion verwendet wird. Allerdings können gcc und clang diesen Code nicht kompilieren und geben den folgenden Fehler aus:

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

Grund für den Fehler

Dieser Fehler tritt aufgrund eines Fehlers in gcc und auf clang im Zusammenhang mit der Handhabung von Standard-Member-Initialisierern innerhalb von Klassen, die als Standardargumente in Funktionen verwendet werden. Die Compiler erwarten, dass der Standard-Member-Initialisierer innerhalb der Klassendefinition selbst und nicht innerhalb des Funktionskörpers definiert wird.

Mögliche Problemumgehungen

Um dieses Problem zu beheben, gibt es zwei mögliche Problemumgehungen:

  1. Entkommentieren von Hints(){}: Das Hinzufügen eines leeren Konstruktors zur Hints-Struktur lindert den Compilerfehler. Dieser Ansatz ist jedoch möglicherweise nicht wünschenswert, da er den Zweck eines Standard-Member-Initialisierers zunichte macht.
  2. Using Hints() = default: Diese Anweisung definiert explizit einen Standardkonstruktor für die Hints-Struktur . Es beseitigt zwar den Compilerfehler in msvc2017, führt jedoch dazu, dass der Code aufgrund des oben genannten Fehlers nicht mit gcc und clang kompatibel ist.

Das obige ist der detaillierte Inhalt vonWarum werfen GCC und Clang „Default Member Initializer Required“ aus, wenn sie eine Klasse als Standardargument verwenden?. 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