„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Die nervigste Analyse: Timer() – Objekt- oder Funktionsaufruf?

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

Veröffentlicht am 21.12.2024
Durchsuche:650

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

Äußerstes Parsen: Mehrdeutigkeit in C 11 aufdecken

Die „ärgerlichste Parsen“-Mehrdeutigkeit in C 11 tritt auf, wenn einheitliche Initialisierer verwendet werden. wie im folgenden Code gezeigt Snippet:

#include 

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

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}

Den ersten Ausdruck verstehen (auto dv = Timer())

Im ersten Ausdruck impliziert das Schlüsselwort auto, dass der Typ von dv vom Initialisierer abgeleitet wird auf der rechten Seite des Gleichheitszeichens (=). Der Initialisierer ist ein Aufruf des Timer-Konstruktors ohne Argumente, der ein Timer-Objekt zurückgibt. Daher ist dv ein Objekt vom Typ Timer.

Den zweiten Ausdruck verstehen (int time_keeper(Timer()))

Im zweiten Ausdruck entsteht die Mehrdeutigkeit, weil Der Compiler kann nicht feststellen, ob Timer() ein Funktionsaufruf oder ein per Referenz übergebenes Objekt vom Typ Timer ist.

  • Wenn Timer() ein Funktionsaufruf ist, dann int time_keeper(Timer()) deklariert eine 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 ein Timer-Objekt als Eingabe verwendet und einen int zurückgibt.

Da Funktionen jedoch in Zeiger zerfallen, wenn sie als Argumente übergeben werden, ist die Der wahre Typ von time_keeper ist int(Timer(*)()), der die Mehrdeutigkeit zugunsten der Zeiger-zu-Funktions-Interpretation auflöst.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3