Heim > Backend-Entwicklung > C++ > Hauptteil

Warum wird die Funktionsüberladung mehrdeutig, wenn in C der negativste ganzzahlige Wert verwendet wird?

Patricia Arquette
Freigeben: 2024-10-30 06:36:03
Original
162 Leute haben es durchsucht

Why Does Function Overloading Become Ambiguous When Using the Most Negative Integer Value in C  ?

Mehrdeutige Funktionsüberladungen mit negativen Ganzzahlliteralen

In C ermöglicht die Funktionsüberladung mehrere Funktionen mit demselben Namen, aber unterschiedlichen Signaturen. Bestimmte Szenarien können jedoch zu mehrdeutigen Funktionsüberladungen führen, was zu Kompilierungsfehlern führt. Dieses Verhalten ist besonders interessant, wenn es um den negativsten ganzzahligen Wert geht.

Betrachten Sie den folgenden Code:

void display(int a)
{
    cout << "int" << endl;
}

void display(unsigned a)
{
    cout << "unsigned" << endl;
}

int main()
{
    int i = -2147483648;
    cout << i << endl; // will display -2147483648
    display(-2147483648);
}
Nach dem Login kopieren

Wie erwartet gibt der Aufruf von cout den Wert von i erfolgreich als -2147483648 aus . Beim Aufruf von display(-2147483648) tritt jedoch ein Fehler auf:

    call of overloaded display(long int) is ambiguous
Nach dem Login kopieren

Interessanterweise gilt dieses Verhalten nur für den negativsten ganzzahligen Wert, und die Mehrdeutigkeit entsteht aufgrund einer interessanten Eigenschaft ganzzahliger Literale in C . In C existieren negative Ganzzahlliterale nicht als unabhängige Einheiten. Stattdessen werden sie als unärer Minusoperator (-) ausgedrückt, der auf ein positives Ganzzahlliteral angewendet wird. Dies bedeutet, dass -2147483648 als -1 * 2147483648 interpretiert wird.

Da 2147483648 den Bereich von int überschreitet, wird es während der Auswertung zu einem langen int heraufgestuft. Wenn der Compiler versucht, den Funktionsaufruf aufzulösen, stößt er folglich auf zwei potenziell mögliche Überladungen:

  • display(int) mit -1 als Argument
  • display(long int) mit 2147483648 als Argument

Diese Mehrdeutigkeit führt zu einem Kompilierungsfehler.

Um dieses Problem zu beheben und das beabsichtigte Verhalten sicherzustellen, wird empfohlen, zum Abrufen das Dienstprogramm std::numeric_limits zu verwenden der minimale oder maximale Wert für einen bestimmten Typ auf tragbare und eindeutige Weise:

std::numeric_limits<int>::min();  // or max()
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum wird die Funktionsüberladung mehrdeutig, wenn in C der negativste ganzzahlige Wert verwendet wird?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!