Mehrdeutigkeit bei der Überladungsauflösung für die negativste ganze Zahl
In C ermöglicht die Funktionsüberladung, dass mehrere Funktionen denselben Namen, aber unterschiedliche Parametertypen haben. Beim Auflösen überladener Funktionsaufrufe kann es jedoch zu Mehrdeutigkeiten kommen, wenn der Compiler nicht die am besten geeignete aufzurufende Funktion ermitteln kann.
Betrachten Sie den folgenden Code, der die Funktionsüberladung für die Anzeige von ganzzahligen und vorzeichenlosen ganzzahligen Werten demonstriert:
<code class="cpp">void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; }
Nach unserem Verständnis sollte jeder ganzzahlige Wert innerhalb des angegebenen Bereichs für int display(int) aufrufen, während Werte außerhalb dieses Bereichs zu Mehrdeutigkeiten führen würden. Beim Versuch, den negativsten int-Wert (-2147483648) zur Anzeige zu übergeben, gibt der Compiler jedoch einen Fehler aus:
call of overloaded display(long int) is ambiguous
Dieses überraschende Verhalten ist auf das Fehlen negativer Ganzzahlliterale in C zurückzuführen. Im C-Standard definierte Ganzzahlliterale enthalten nicht das Zeichen „-“. Wenn stattdessen ein „-“ gefolgt von einer Zahl auftritt, behandelt der Compiler es als unären Negationsoperator, der auf ein positives Ganzzahlliteral angewendet wird.
In unserem Fall wird „-2147483648“ als „-1 *“ interpretiert. 2147483648'. Da „2147483648“ den Bereich eines int überschreitet, wird es zu einem long int heraufgestuft. Diese Typheraufstufung führt zu Mehrdeutigkeiten, da jetzt sowohl display(int) als auch display(long int) geeignete Kandidaten für den Funktionsaufruf sind.
Um solche Mehrdeutigkeiten zu vermeiden, wird empfohlen, die Klasse std::numeric_limits zu verwenden Rufen Sie die Minimal- oder Maximalwerte für verschiedene Datentypen auf portable Weise ab:
<code class="cpp">std::cout << std::numeric_limits<int>::min() << endl;</code>
Das obige ist der detaillierte Inhalt vonWarum führt die Übergabe der negativsten Ganzzahl an eine überladene Funktion zu Mehrdeutigkeiten in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!