2017-08-19 1 views
5

Betrachten Sie dieses Programm:Warum ist die Funktionsüberladung, die einen int bevorzugt gegenüber dem einen vorzeichenlosen Zeichen nimmt?

#include <iostream> 

using namespace std; 

void f(unsigned char c) { 
    cout << c << endl; 
} 

void f(int c) { 
    cout << c << endl; 
} 

int main() { 
    f('a'); 
} 

Dies druckt 97 aus, was darauf hindeutet, dass die f() Überlastung, dass derjenige ausgewählt wurde, war ein int nehmen. Ich finde das komisch; würde nicht intuitiv eine unsigned char eine bessere Übereinstimmung für eine char sein?

+2

es ist, weil auf Ihrem Compiler char == signiert Char – Sopel

+0

Ich kann kein richtiges Duplikat finden, aber es gibt wahrscheinlich einen. Was Sie suchen ist, wie Konvertierungssequenzen gehandhabt werden. –

+3

Dies ist ähnlich und sollte dazu beitragen, die Dinge zu erklären. https://stackoverflow.com/questions/37166131/why-does-the-compiler-match-char-to-int-but-not-short –

Antwort

8

nicht intuitiv ein unsigned char eine bessere Übereinstimmung für ein char sein?

Nun, ich denke, aber nicht nach dem Standard. Nach [conv.prom]p1:

A prvalue einem ganzzahligen anderen Typ als bool, char16_­t, char32_­t oder wchar_­t ganzzahlige Umwandlungs rank dessen kleiner als der Rang des int kann int wenn int auf eine prvalue vom Typ umgewandelt werden kann darstellen alle Werte des Quelltyps; [...]

Nun werden die drei Charaktertypen haben den gleichen Rang, und ein signiertes Typ hat einen Rang immer weniger als int. Dies ist eine Kombination von [conv.rank]p1.6 und [conv.rank]p1.2:

  • Der Rang eines Integer-Typs unterzeichnet wird größer sein als der Rang eines signierten Integer-Typs mit einer kleineren Größe.

  • [...]

  • Der Rang char soll den Rang eines signed char und unsigned char gleich.

Grundsätzlich hat jeder Charakter immer einen kleineren Rang als int und sie können alle in einem int dargestellt werden, und so die Überlastung mit unsigned char gibt kein besseres Spiel, weil es eine Umwandlung von char bedeuten würde zu unsigned char, anstelle einer Beförderung.

Wenn Sie Ihre Überlastung ändern, um eine char zu nehmen, dann würde es eine genaue Übereinstimmung geben, und natürlich würde die "richtige" Überladung (in Ihren Augen) gewählt werden.

+1

Es gibt auch eine gute Referenz [hier] (http: // en. cppreference.com/w/cpp/language/overload_resolution), Abschnitt * "Ranking impliziter Konvertierungssequenzen" *. Es besagt grundsätzlich, dass Integer/Gleitkomma-Promotion gegenüber Conversion bevorzugt ist. – HolyBlackCat

Verwandte Themen