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); }
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
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:
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()
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!