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!