Heim > Backend-Entwicklung > C++ > Ist „Timer()' eine Funktion oder ein Objekt? Den „Most Vexing Parse' in C 11 verstehen.

Ist „Timer()' eine Funktion oder ein Objekt? Den „Most Vexing Parse' in C 11 verstehen.

Barbara Streisand
Freigeben: 2024-11-02 15:33:29
Original
769 Leute haben es durchsucht

Is

Äußerst irritierende Parse-Verwirrung: Klärung der Mehrdeutigkeit

In C 11 führen einheitliche Initialisierer eine subtile Mehrdeutigkeit ein, die als „höchst irritierende Parse“ bekannt ist. Sehen wir uns ein Beispiel an, das dieses Problem veranschaulicht:

<code class="cpp">#include <iostream>

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

Analyse:

In der ersten Zeile:

<code class="cpp">auto dv = Timer();</code>
Nach dem Login kopieren
  • Was ist Timer()? Timer() ist ein Konstruktor der Timer-Klasse, der keine Argumente akzeptiert. Es initialisiert ein Objekt vom Typ Timer.
  • Welcher Typ ist dv? dv wird mit auto deklariert, das seinen Typ vom Initialisierer ableitet. Da der Initialisierer vom Typ Timer ist, ist dv vom Typ Timer.

In der zweiten Zeile:

<code class="cpp">int time_keeper(Timer());</code>
Nach dem Login kopieren
  • Ist das eine Funktion? Ja, das ist eine Funktionsdeklaration. Es deklariert eine Funktion namens time_keeper, die ein int zurückgibt und ein Argument akzeptiert.
  • Warum ist das Argument nicht „Timer () ()“? Dies ist ein besonderer Fall von die „ärgerlichste Analyse“-Mehrdeutigkeit. Wenn eine Funktion als Argument an eine andere Funktion übergeben wird, zerfällt sie automatisch in einen Zeiger auf die Funktion. In diesem Fall ist das Argument also nicht Timer () (), sondern Timer().

Um dies zu beweisen, betrachten Sie das folgende Programm:

<code class="cpp">#include <type_traits>

struct Timer { };
int main() {
    int time_keeper(Timer());
    static_assert(
        std::is_same<
            decltype(time_keeper),
            int(Timer(*)())
        >::value,
        "This should not fire!");
}</code>
Nach dem Login kopieren

Dieses Programm wird erfolgreich kompiliert und bestätigt, dass time_keeper einen Zeiger auf eine Funktion als Argument akzeptiert.

Zusammenfassend lässt sich sagen, dass die „ärgerste Parse“-Verwirrung auf die Tatsache zurückzuführen ist, dass der Ausdruck Timer() als interpretiert werden kann entweder ein Objekt vom Typ Timer oder ein Funktionszeiger auf eine Funktion, die einen Timer zurückgibt. Die richtige Interpretation hängt vom Kontext ab, in dem der Ausdruck verwendet wird.

Das obige ist der detaillierte Inhalt vonIst „Timer()' eine Funktion oder ein Objekt? Den „Most Vexing Parse' in C 11 verstehen.. 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