Ä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>
In der zweiten Zeile:
<code class="cpp">int time_keeper(Timer());</code>
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!