Verstehen der „Ärgerlichsten Analyse“-Mehrdeutigkeit in C-Uniform-Initialisierern
Die „Ärgerlichste Analyse“ bezieht sich auf eine Mehrdeutigkeit, die auftreten kann, wenn unter Verwendung einer einheitlichen Initialisierungssyntax in C 11. Diese Mehrdeutigkeit tritt auf, wenn unklar ist, ob ein Codeausdruck ein Objekt initialisiert oder eine Funktion aufruft, die ein Objekt zurückgibt.
Um diese Mehrdeutigkeit zu veranschaulichen, betrachten Sie den folgenden Code:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { // Case 1: Initializing an object auto dv = Timer(); // Case 2: Calling a function int time_keeper(Timer()); return 0; }</code>
Fall 1: Initialisieren eines Objekts
Im ersten Fall initialisiert auto dv = Timer() ein Objekt vom Typ Timer namens dv. Der dv-Typ wird als Timer abgeleitet, da wir auto verwenden, um ihn zu deklarieren.
Fall 2: Aufrufen einer Funktion
Im zweiten Fall int time_keeper(Timer ()) deklariert eine Funktion namens time_keeper, die einen int zurückgibt und als Argument einen Zeiger auf eine Funktion verwendet, die einen Timer zurückgibt und kein Argument akzeptiert.
Der Grund, warum das Argument nicht Timer (*) () ist ist, dass Funktionen in Zeiger zerfallen, wenn sie als Argument übergeben werden. Daher ist der Typ von time_keeper tatsächlich int(Timer(*)()).
Diese Mehrdeutigkeit kann vermieden werden, indem der Typ der zu initialisierenden Variablen explizit angegeben oder die Signatur der Funktion explizit deklariert wird. Zum Beispiel:
<code class="cpp">// Explicitly specify the type of the variable auto dv: Timer = Timer(); // Explicitly declare the function's signature int time_keeper(Timer (*)());</code>
Das obige ist der detaillierte Inhalt vonWann wird die einheitliche C-Initialisierung zur „ärgerlichsten Analyse'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!