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 int
Bereich angegebene Wert (in meinem Fall int
4 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 int
Ausnahme des Mindestwerts, dh -2147483648
wenn die Kompilierung mit dem Fehler fehlschlägt
Anruf überladen
display(long int)
ist mehrdeutig
Aber den gleichen Wert zu nehmen und den Wert zu int
drucken, 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 short
verwendet 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 long
Constexpr-Werte zugelassen werden 2147483647LL
, um sie bei der Initialisierung einzugrenzen .