Heim > Backend-Entwicklung > C++ > Wie kann „vector v(istream_iterator(cin), istream_iterator());' als Funktionsdeklaration in C interpretiert werden?

Wie kann „vector v(istream_iterator(cin), istream_iterator());' als Funktionsdeklaration in C interpretiert werden?

Susan Sarandon
Freigeben: 2024-12-16 12:13:10
Original
220 Leute haben es durchsucht

How Can `vector v(istream_iterator(cin), istream_iterator());` Be Interpreted as a Function Declaration in C  ?

The Most Vexing Parse: Klärung eines verwirrenden Details

In der Programmierung bezieht sich der „Most Vexing Parse“ auf eine berüchtigte Mehrdeutigkeit in der C-Syntax Dies kann zu unerwarteten Funktionsdeklarationen führen. Ziel dieses Artikels ist es, einen solchen verwirrenden Aspekt des Most Vexing Parse aufzudecken.

Betrachten Sie die folgende Codezeile:

vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());
Nach dem Login kopieren

Wie kann diese Zeile als Funktionsdeklaration geparst werden?

Die Syntax verstehen

Normalerweise am meisten Ein ärgerliches Parse-Problem entsteht, wenn ein zweites temporäres Objekt als Funktion interpretiert wird, die einen Iterator zurückgibt und keine Argumente akzeptiert. In diesem Fall ist es jedoch das erste temporäre Objekt, istream_iterator(cin), das das Dilemma darstellt.

Das erste temporäre Objekt, istream_iterator(cin), ist identisch mit istream_iterator< int> cin mit überflüssigen Klammern. Diese Syntax wurde von C entlehnt und als Fehler anerkannt.

Die Interpretation

Der Compiler interpretiert istream_iterator(cin) als Deklaration eines Parameters mit dem Namen cin, der vom Typ istream_iterator ist. Die Klammern haben keinen Einfluss auf die Bedeutung der Anweisung.

Daher wird die Codezeile als Funktionsdeklaration mit einem Parameter, cin, interpretiert, der vom Typ istream_iterator ist. Die Funktion gibt einen Vektor von ganzen Zahlen zurück.

Beliebige Klammern in Argumentlisten

Die Klammern um cin in istream_iterator(cin) weisen nicht darauf hin, dass es sich um eine handelt Argument einer Funktion in Klammern. Stattdessen schließen sie einfach einen Ausdruck ein, der einen Wert vom Typ istream_iterator ergibt.

Fazit

Der Schlüssel zum Verständnis dieses Falles liegt darin, zu erkennen, dass das Überflüssige ist Klammern ändern nichts an der Bedeutung der Aussage. Die Interpretation von istream_iterator(cin) als Parametertyp und nicht als Funktionsaufruf in Klammern beseitigt die Verwirrung in diesem speziellen Beispiel der Most Vexing Parse.

Das obige ist der detaillierte Inhalt vonWie kann „vector v(istream_iterator(cin), istream_iterator());' als Funktionsdeklaration in C interpretiert werden?. 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