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
Barbara StreisandOriginal
2024-11-02 15:33:29818Durchsuche

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>

Analyse:

In der ersten Zeile:

<code class="cpp">auto dv = Timer();</code>
  • 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>
  • 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>

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!

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