Heim  >  Artikel  >  Backend-Entwicklung  >  Die nervigste Analyse: Timer() – Objekt- oder Funktionsaufruf?

Die nervigste Analyse: Timer() – Objekt- oder Funktionsaufruf?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 18:09:01201Durchsuche

The Most Vexing Parse: Timer() - Object or Function Call?

Ä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.

  • Wenn Timer() ein Funktionsaufruf ist, dann deklariert int time_keeper(Timer()) a Funktion namens time_keeper, die ein Timer-Objekt als Eingabe verwendet und ein int zurückgibt.
  • Wenn Timer() ein Objekt vom Typ Timer ist, dann deklariert int time_keeper(Timer()) eine Funktion namens time_keeper, die einen Zeiger auf akzeptiert ein Timer-Objekt als Eingabe und gibt ein int zurück.

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!

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