2015-07-22 10 views
5

Ich wollte diese durch articleWie ist das ein ärgerlicher Parse?

und es gibt eine Erklärung in Artikel 3

// C++98 
rectangle  w(origin(), extents());  // oops, vexing parse 

zu sagen, wie die über einem drängendsten Parse ist. Wenn ich so etwas wie dieses

Rectangle s(origin());  

struct origin 
{ 
}; 
struct Rectangle 
{ 
    Rectangle(const origin& s) 
    { 
    } 
}; 

Die Aussage

hat funktioniert und keinen ärgerlichen Parse ähneln. Warum hat der Autor gesagt, dass es ein ärgerlicher Parse ist. Ist das ein Tippfehler oder fehlt mir etwas?

+0

Siehe Abschnitt 1 (b) des Dokuments, es erklärt diese ärgerlichen Pars. – Barmar

+3

Warum sagst du 'Rectangle s (origin());' ähnelt nicht einem ärgerlichen Parse? Es ist das kanonische Beispiel für das ärgste Parsen. Was denkst du am ärgsten, wenn nicht das? –

+1

Die Deklaration funktioniert einwandfrei. Versuchen Sie, * 's' zu verwenden und sehen Sie, was passiert. – molbdnilo

Antwort

8

Rectangle s(origin()); ist auch ein ärgerlicher Parse. Es deklariert eine Funktion s, die rectangle zurückgibt und als Argumentzeiger auf die Funktion origin zurückgibt. Nicht sicher, was Sie mit "funktioniert gut" gemeint haben.

rectangle w(origin(), extents()); deklariert eine Funktion wrectangle Rückkehr und Argumente nimmt: Zeiger auf Funktion origin zurückkehrt, und Zeiger auf Funktion extents zurückkehrt.

Für weitere Informationen see this question oder durchsuchen Sie die anderen Fragen unter dem Tag.

+0

Mit funktioniert gut, ich meine, dass es kompiliert ohne Fehler. Ich habe den Eindruck, dass ein lästiges Parsen einen Kompilierzeitfehler ergeben würde. zum Beispiel für eine Klasse 'foo', die es wie' foo a(); 'verwendet, würde beim Kompilieren einen Fehler geben und es ist eine Form von am meisten ärgerlichem Parse. –

+0

@James Franco, erst wenn Sie versuchen, es zu benutzen, als ob es ein Objekt wäre – sbabbi

+3

@JamesFranco, wenn es keine gültige Deklaration wäre, dann wäre es keine ärgerliche Analyse. Der "ärgerliche" Teil ist, weil Sie versucht haben, eine Variablendeklaration zu schreiben, aber es war syntaktisch gültig als Funktionsdeklaration. Funktionserklärungen sind natürlich legal. –