Heim > Backend-Entwicklung > C++ > Hauptteil

Ist „Timer()' ein Konstruktoraufruf oder ein Funktionsaufruf? Die „Most Vexing Parse'-Mehrdeutigkeit in C

Susan Sarandon
Freigeben: 2024-11-02 13:25:30
Original
913 Leute haben es durchsucht

Is `Timer()` a Constructor Call or a Function Call? The

Die „ärgerlichste Parse“-Mehrdeutigkeit: Einheitliche Initialisierer enträtseln

Im Bereich von C kann die „ärgerlichste Parse“-Mehrdeutigkeit auftreten wenn auf einheitliche Initialisierer gestoßen wird, wie durch den folgenden Code veranschaulicht:

<code class="cpp">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>
Nach dem Login kopieren

Interpretation von dv

In der Zeile auto dv = Timer(); der Typ von dv hängt von der Interpretation von Timer() ab. Dies kann entweder sein:

  • Ein Konstruktoraufruf, der ein Objekt vom Typ Timer instanziiert.
  • Ein Funktionsaufruf für eine hypothetische Operator()-Überladung in Timer, da eine einheitliche Initialisierung verwendet werden kann um Funktionsaufrufe aufzurufen.

In diesem Fall bedeutet es einen Konstruktoraufruf, was dazu führt, dass dv ein Objekt vom Typ Timer ist. Das Schlüsselwort auto leitet den Typ basierend auf dem Initialisierer ab.

Time_keeper verstehen

In der Zeile int time_keeper(Timer()); wird eine Funktion namens time_keeper deklariert. Das Argument ist kein Funktionszeiger vom Typ Timer (*) (), wie man erwarten könnte. Es stellt vielmehr einen Zeiger auf eine Funktion dar, die einen Timer zurückgibt und keine Argumente akzeptiert. Dies liegt daran, dass:

  • Funktionen implizit in einen Zeiger auf eine Funktion zerfallen, wenn sie als Argumente übergeben werden.
  • In diesem speziellen Fall zerfällt der Funktionsaufruf in einen Zeiger auf eine Funktion, die a zurückgibt Timer und akzeptiert keine Argumente, d. h. Timer(*)().

Fazit

Die Mehrdeutigkeit der „ärgerlichsten Analyse“ unterstreicht das Potenzial für Verwirrung bei der Interpretation bestimmter Konstrukte in C . Das Verständnis des Konzepts der einheitlichen Initialisierung und des Funktionsabfalls ist entscheidend, um solche Szenarien richtig zu verstehen.

Das obige ist der detaillierte Inhalt vonIst „Timer()' ein Konstruktoraufruf oder ein Funktionsaufruf? Die „Most Vexing Parse'-Mehrdeutigkeit in C. 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