Heim > Artikel > Backend-Entwicklung > Die nervigste Analyse: Timer() – Objekt- oder Funktionsaufruf?
Ärgerlichste Analyse: Mehrdeutigkeit in C 11 aufdecken
Die „ärgerlichste Analyse“-Mehrdeutigkeit in C 11 tritt auf, wenn einheitliche Initialisierer verwendet werden. wie im folgenden Codeausschnitt gezeigt:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { auto dv = Timer(); // Ambiguity: Object or function call? int time_keeper(Timer()); // Ambiguity: Pointer or call? return 0; }</code>
Den ersten Ausdruck verstehen (auto dv = Timer())
Im ersten Ausdruck impliziert das Schlüsselwort auto dass der Typ von dv aus dem Initialisierer auf der rechten Seite des Gleichheitszeichens (=) abgeleitet wird. Der Initialisierer ist ein Aufruf des Timer-Konstruktors ohne Argumente, der ein Timer-Objekt zurückgibt. Daher ist dv ein Objekt vom Typ Timer.
Verstehen des zweiten Ausdrucks (int time_keeper(Timer()))
Im zweiten Ausdruck entsteht die Mehrdeutigkeit, weil Der Compiler kann nicht feststellen, ob Timer() ein Funktionsaufruf oder ein als Referenz übergebenes Objekt vom Typ Timer ist.
Da Funktionen jedoch in Zeiger zerfallen, wenn sie als Argumente übergeben werden, ist der wahre Typ von time_keeper int(Timer(*)()), der das auflöst Mehrdeutigkeit zugunsten der Zeiger-zu-Funktions-Interpretation.
Das obige ist der detaillierte Inhalt vonDie nervigste Analyse: Timer() – Objekt- oder Funktionsaufruf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!