Heim >Backend-Entwicklung >C++ >Warum können Initialisierungslisten nicht direkt als Operanden in C-Binäroperator-Ausdrücken verwendet werden?

Warum können Initialisierungslisten nicht direkt als Operanden in C-Binäroperator-Ausdrücken verwendet werden?

DDD
DDDOriginal
2024-12-09 17:56:10648Durchsuche

Why Can't Initializer Lists Be Used Directly as Operands in C   Binary Operator Expressions?

Initialisierungslisten in Operatorausdrücken: Ein Dilemma

In C bieten Initialisierungslisten, eingeschlossen in geschweifte Klammern, eine praktische Möglichkeit, Variablen zu initialisieren . Beim Versuch, Initialisierungslisten in Operatorausdrücken zu verwenden, stellt sich jedoch eine interessante Frage. Betrachten Sie den folgenden Code:

class foo { };

struct bar
{
    template<typename... T>
    bar(T const&...) { }
};

foo& operator<<(foo& f, bar const&) { return f; }

int main()
{
    foo baz;
    baz << {1, -2, "foo", 4, 5}; // This line gives an error
    return 0;
}

Warum gibt dieser Code einen Fehler aus, insbesondere in Bezug auf die Zeile, die den Ausdruck baz << enthält? {1, -2, "foo", 4, 5};? Der Grund liegt in der Definition von Initialisierungslisten im C-Standard.

Initialisierungslisten: Eine Ausnahme von Ausdrücken

Unter §5 des Standards sind Ausdrücke genau definiert. Überraschenderweise werden Initialisierungslisten selbst nicht als Ausdrücke betrachtet. Binäre Operatoren, einschließlich <<, erwarten Ausdrücke als Argumente. Da Initialisierungslisten dieses Kriterium nicht erfüllen, können sie daher nicht direkt als Operanden binärer Operatoren verwendet werden.

Begrenzte Ausnahmen

Der Standard sieht mehrere Ausnahmen für Initialisierungslisten vor. Listenverwendung, auch als Funktionsargumente und in Zuweisungsanweisungen. Die Ausnahme erstreckt sich jedoch nicht auf binäre Operatoren.

Gründe für die Einschränkung

Die Gründe für diese Einschränkung sind vielfältig. Dem Entwurf/Diskussionspapier N2215 zufolge würde die Zulassung von Initialisierungslisten sowohl als linke als auch rechte Operanden von Operatoren zu grammatikalischen Komplexitäten führen, die Parser vor Herausforderungen stellen würden. Die Autoren des Papiers entschieden letztendlich, dass es zu umständlich wäre, sie auf der rechten Seite, aber nicht auf der linken Seite zuzulassen.

Schlussfolgerung

While Initializer Lists Obwohl sie in bestimmten Kontexten praktisch sind, ist ihre eingeschränkte Verwendung auf der rechten Seite der Operatoren auf syntaktische Herausforderungen und den Wunsch nach Konsistenz in der Grammatik der Sprache zurückzuführen. Als Alternative zu Initialisierungslisten als Operanden kann man Konstruktoraufrufe verwenden oder Bar-Instanzen direkt als Argumente an den Operator<<() übergeben, wie im geänderten Code zu sehen ist:

baz << bar{1, -2, "foo", 4, 5};

Das obige ist der detaillierte Inhalt vonWarum können Initialisierungslisten nicht direkt als Operanden in C-Binäroperator-Ausdrücken verwendet werden?. 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