Heim > Artikel > Backend-Entwicklung > Ist „Timer()“ ein Konstruktoraufruf oder ein Funktionsaufruf? Die „Most Vexing Parse“-Mehrdeutigkeit in C
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>
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:
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:
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!