Heim > Backend-Entwicklung > C++ > Wann wird die einheitliche C-Initialisierung zur „ärgerlichsten Analyse'?

Wann wird die einheitliche C-Initialisierung zur „ärgerlichsten Analyse'?

DDD
Freigeben: 2024-11-01 21:37:29
Original
1057 Leute haben es durchsucht

When Does C   Uniform Initialization Become the

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage