Ich lerne etwas über Funktionsüberladung in C ++ und bin auf Folgendes gestoßen:
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);
}
Soweit ich verstanden habe, wird jeder im intBereich angegebene Wert (in meinem Fall int4 Byte) aufgerufen display(int)und jeder Wert außerhalb dieses Bereichs ist mehrdeutig (da der Compiler nicht entscheiden kann, welche Funktion aufgerufen werden soll). Sie gilt für den gesamten Wertebereich mit intAusnahme des Mindestwerts, dh -2147483648wenn die Kompilierung mit dem Fehler fehlschlägt
Anruf überladen
display(long int)ist mehrdeutig
Aber den gleichen Wert zu nehmen und den Wert zu intdrucken, ergibt 2147483648. Ich bin buchstäblich verwirrt mit diesem Verhalten.
Warum wird dieses Verhalten nur beobachtet, wenn die negativste Zahl übergeben wird? (Das Verhalten ist das gleiche, wenn a shortverwendet wird -32768- in jedem Fall, wenn die negative und die positive Zahl dieselbe binäre Darstellung haben.)
Verwendeter Compiler: g ++ (GCC) 4.8.5
call of overloaded ‘display(long int)’ is ambiguous.
typeof(-2147483648) != int. Das Literal ist 2147483648, was zu groß für ein ist int, also ist es ein long, und es wird negiert
int j{-2147483648};es sich um eine engere Konvertierung handelt. Fast eine Frage an sich wert, das. Es hängt wahrscheinlich damit zusammen, dass (z. B.) long longConstexpr-Werte zugelassen werden 2147483647LL, um sie bei der Initialisierung einzugrenzen .

