Mehrdeutige Funktionsüberladung für den negativsten ganzzahligen Wert
In C ermöglicht die Funktionsüberladung mehrere Funktionen mit demselben Namen, aber unterschiedlichen Parametern. Es entsteht jedoch Unklarheit, wenn der Compiler anhand der angegebenen Argumente nicht bestimmen kann, welche überladene Funktion aufgerufen werden soll. Dieses Problem kann bei der Arbeit mit Ganzzahltypen auftreten, insbesondere beim Umgang mit dem negativsten Wert.
Beachten Sie den folgenden Codeausschnitt:
<code class="c++">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 unserem Verständnis von Funktionsüberladung jeder Wert innerhalb des Ganzzahlbereichs (in diesem Fall 4 Bytes) sollte die Funktion display(int) aufrufen. Werte außerhalb dieses Bereichs würden zu Unklarheiten führen. Das Kompilieren dieses Codes führt jedoch zu folgendem Fehler:
call of overloaded `display(long int)` is ambiguous
Dieser Fehler tritt auf, wenn der negativste ganzzahlige Wert (-2147483648) an die Anzeigefunktion übergeben wird. Seltsamerweise führt das direkte Drucken desselben Werts (wie in Zeile 6 zu sehen) zum korrekten Ergebnis: -2147483648.
Die Subtilität: Mangel an negativen Literalen in C
The Der Schlüssel zum Verständnis dieses Verhaltens liegt im Fehlen negativer Literale in C. Alle ganzzahligen Literale in C werden standardmäßig als vorzeichenlos betrachtet, was bedeutet, dass sie kein Vorzeichenpräfix (- oder ) haben. Infolgedessen wird -2147483648 tatsächlich als -1 * (2147483648) behandelt.
Auswirkungen auf überladene Funktionen
Da 2147483648 den Bereich einer Ganzzahl (4 Bytes) überschreitet ), wird es zu einer langen Ganzzahl heraufgestuft. Dies bedeutet, dass der Compiler versucht, die Funktion display(long int) aufzurufen, was zu einem Konflikt mit der vorhandenen Überladung display(int) führt. Daher entsteht die Mehrdeutigkeit.
Auflösung
Um diese Mehrdeutigkeit zu vermeiden, wird empfohlen, die Klasse std::numeric_limits zu verwenden, um typspezifische Minimal- und Maximalwerte zu erhalten :
<code class="c++">std::cout << std::numeric_limits<int>::min() << endl; // displays -2147483648</code>
Das obige ist der detaillierte Inhalt vonWarum führt die Übergabe des negativsten ganzzahligen Werts an eine überladene Funktion in C zu einem Mehrdeutigkeitsfehler, obwohl das direkte Drucken des Werts korrekt funktioniert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!