Heim > Backend-Entwicklung > C++ > Hauptteil

Können Initialisierungslisten const-Member-Arrays in C 0x initialisieren?

Barbara Streisand
Freigeben: 2024-11-02 16:15:29
Original
281 Leute haben es durchsucht

Can initializer lists initialize const member arrays in C  0x?

Initialisierungslisten für Member-Arrays: Ein C 0x-Rätsel

In C 0x hat die Einführung von Initialisierungslisten neue Möglichkeiten zur Initialisierung von Daten eröffnet Mitglieder. Es kann jedoch zu einem häufigen Missverständnis kommen, wenn versucht wird, sie mit Arrays von const-Mitgliedern zu verwenden.

Bedenken Sie den folgenden Code:

<code class="cpp">struct Foo {
    int const data[2];

    Foo(std::initializer_list<int const>& ini)
    : data(ini)
    {}
};

int main() {
    Foo f = {1, 3};
}</code>
Nach dem Login kopieren

Entgegen den Erwartungen lässt sich dieser Code nicht mit kompilieren Fehler:

<code class="text">incompatible types in assignment of ‘std::initializer_list<const int>’ to ‘const int [2]’</code>
Nach dem Login kopieren

Das Problem ergibt sich aus der Tatsache, dass die Array-Mitgliedsdaten konstant sind, während die Initialisierungsliste ini nicht konstante Werte enthält. Um diese Nichtübereinstimmung zu beheben, müsste der Compiler eine konstante Konvertierung für jeden Wert in der Initialisierungsliste durchführen. Dies ist jedoch durch die Sprachspezifikationen nicht zulässig.

Variadic Template Constructor zur Rettung

Anstelle der Verwendung eines Initialisierungslistenkonstruktors kann ein Variadic Template Constructor verwendet werden :

<code class="cpp">struct Foo {
    int x[2];
    template <typename... T>
    Foo(T... ts) : x{ts...} {}
};

int main() {
    Foo f1(1, 2);
    Foo f2{1, 2};
}</code>
Nach dem Login kopieren

Dieser Konstruktor akzeptiert eine variable Anzahl von Parametern und ermöglicht so eine direkte Initialisierung der Array-Elemente. Beachten Sie die Verwendung von Klammer-Init-Listen in der Initialisierungsphase {ts...}.

Nichtkonstanter Fall

Wenn Konstanz keine Voraussetzung ist, eine andere Der Ansatz besteht darin, die Initialisierung im Konstruktor zu überspringen und das Array im Funktionskörper zu füllen:

<code class="cpp">struct Foo {
    int x[2];

    Foo(std::initializer_list<int> il) {
        std::copy(il.begin(), il.end(), x);
    }
};</code>
Nach dem Login kopieren

Diese Methode verliert die Überprüfung der Grenzen zur Kompilierungszeit, ist aber in bestimmten Situationen immer noch eine praktikable Option.

Das obige ist der detaillierte Inhalt vonKönnen Initialisierungslisten const-Member-Arrays in C 0x initialisieren?. 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!