Heim >Backend-Entwicklung >C++ >Was ist der nervigste Parse und warum passiert er in C 11?

Was ist der nervigste Parse und warum passiert er in C 11?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 10:55:30856Durchsuche

What's the Most Vexing Parse and Why Does It Happen in C  11?

Grundlegendes zu einheitlichen Initialisierern und der schwierigsten Analyse

In C 11 stellen einheitliche Initialisierer eine prägnante Syntax für die Initialisierung von Objekten und Datenstrukturen bereit. Ihre Verwendung kann jedoch zu potenzieller Mehrdeutigkeit führen, die als „Most Vexing Parse“ bezeichnet wird.

Most Vexing Parse

Beachten Sie den folgenden Codeausschnitt:

<code class="cpp">#include<iostream>

class Timer
{
public:
    Timer() {}
};

int main() 
{
    auto dv = Timer(); // What is Timer() ? And what type is dv?
    int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"?
    return 0;
}</code>

Analyse:

dv = Timer();

  • Timer() kann als eine Funktion interpretiert werden Aufruf oder eine Objektkonstruktion.
  • Da auto zum Deklarieren von dv verwendet wird, wird sein Typ aus dem Ausdruck auf der rechten Seite abgeleitet.
  • Wenn Timer() als Funktionsaufruf interpretiert wird , dv wäre ein int, da Timer() keine Funktion ist, die ein Objekt zurückgibt.
  • Wenn Timer() jedoch als Objektkonstruktion interpretiert wird, wäre dv ein Timer-Objekt.

int time_keeper(Timer());

  • Timer() wird als Erstellung eines temporären Timer-Objekts interpretiert.
  • Das Argument von time_keeper ist ein Zeiger auf eine Funktion, die einen Timer zurückgibt und keine Argumente akzeptiert.
  • Die Funktion wird implizit in einen Zeiger konvertiert, wenn sie als Argument übergeben wird.
  • Daher ist der Typ von time_keeper int(Timer (*)()).

Schlussfolgerung:

Im Szenario mit der „ärgsten Analyse“ versucht der Compiler, auf den Typ und die Interpretation eines zu schließen Ausdruck basierend auf Kontext und Regeln. Wenn Programmierer verstehen, wie diese Regeln gelten, können sie Unklarheiten vermeiden und Code mit einer klaren Absicht schreiben.

Das obige ist der detaillierte Inhalt vonWas ist der nervigste Parse und warum passiert er in C 11?. 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