Wie ist das eine höchst ärgerliche Analyse?

Lesezeit: 2 Minuten

Benutzer-Avatar
James Franco

Ich habe das durchgemacht Artikel

und es gibt eine Aussage in Punkt 3, die besagt

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

Wie ist das obige eine äußerst ärgerliche Analyse. Wenn ich so etwas mache

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

Die Aussage

 Rectangle s(origin());    

funktioniert gut und ähnelt keiner lästigen Analyse. Warum hat der Autor gesagt, dass es eine ärgerliche Analyse ist. Ist das ein Tippfehler oder übersehe ich etwas?

  • Siehe Abschnitt 1(b) des Dokuments, es erklärt diese ärgerlichen Analysen.

    – Barmar

    22. Juli 2015 um 21:53 Uhr

  • Wieso sagst du Rectangle s(origin()); ähnelt nicht einer ärgerlichen Analyse? Es ist das kanonische Beispiel für die ärgerlichste Analyse. Was ist Ihrer Meinung nach die ärgerlichste Analyse, wenn nicht das?

    – Benjamin Lindley

    22. Juli 2015 um 21:56 Uhr


  • Die Deklaration funktioniert einwandfrei. Versuchen zu benutzen s und sehen was passiert.

    – molbnilo

    22. Juli 2015 um 21:58 Uhr

  • Ich verstehe, dass es einer ärgerlichen Analyse ähnelt. Ich habe jedoch den Eindruck, dass eine ärgerliche Analyse zu einem Kompilierzeitfehler führen würde. zum Beispiel für eine Klasse foo, die es wie verwendet foo a(); würde beim Kompilieren einen Fehler geben und es ist eine Form der ärgerlichsten Analyse. Was ich also bekomme, ist, dass eine Anweisung einer ärgerlichen Analyse ähneln und gleichzeitig ohne Probleme kompilieren könnte. Eine ärgerliche Analyse von dem, was ich verstehe, ist eine Aussage, die einer Funktion ähneln könnte. <Return type> functionName (parameters..)

    – James Franco

    22. Juli 2015 um 22:34 Uhr

  • Der Grund, warum wir es nennen ärgerlich liegt an der Deklaration nicht einen Kompilierzeitfehler verursachen. Es verursacht erst später im Programm einen Fehler Wenn Sie verwenden die Funktion.

    – Aaron McDaid

    22. Juli 2015 um 22:36 Uhr


Benutzer-Avatar
MM

Rectangle s(origin()); ist auch eine ärgerliche Analyse. Es deklariert eine Funktion s die zurückkehrt rectangleund nimmt als Argument einen Zeiger auf die zurückkehrende Funktion origin. Ich bin mir nicht sicher, was Sie mit “funktioniert gut” gemeint haben.

rectangle w( origin(), extents() ); deklariert eine Funktion w Rückkehr rectangle und Argumente nehmen: Zeiger auf die zurückkehrende Funktion originund Zeiger auf die zurückkehrende Funktion extents.

Weitere Einzelheiten finden Sie in dieser Frage oder durchsuchen Sie die anderen Fragen unter dem Most-Vexing-Parse-Tag.

  • Mit gut funktionieren meinte ich, dass es ohne Fehler kompiliert wird. Ich habe den Eindruck, dass eine ärgerliche Analyse einen Kompilierzeitfehler ergeben würde. zum Beispiel für eine Klasse foo Verwenden Sie es wie foo a(); würde beim Kompilieren einen Fehler geben und es ist eine Form der ärgerlichsten Analyse.

    – James Franco

    22. Juli 2015 um 22:31 Uhr

  • @James Franco, nicht bis Sie versuchen, es so zu verwenden, als wäre es ein Objekt

    – Sbabbi

    22. Juli 2015 um 22:33 Uhr

  • @JamesFranco Wenn es keine gültige Deklaration wäre, wäre es keine ärgerliche Analyse. Der “ärgerliche” Teil ist, weil Sie versucht haben, eine Variablendeklaration zu schreiben, die aber zufällig als Funktionsdeklaration syntaktisch gültig war. Funktionsdeklarationen sind offensichtlich erlaubt.

    – MM

    22. Juli 2015 um 22:42 Uhr


1012480cookie-checkWie ist das eine höchst ärgerliche Analyse?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy