Unterschiede im Verhalten zwischen char, signiertem char und unsigniertem char
Der folgende Code wird erfolgreich kompiliert, aber char verhält sich anders als ganzzahlige Typen.
cout << getIsTrue< isX<int8>::ikIsX >() << endl; cout << getIsTrue< isX<uint8>::ikIsX >() << endl; cout << getIsTrue< isX<char>::ikIsX >() << endl;
Das Ergebnis sind drei Instanziierungsmuster für drei Typen: int8, uint8 und char. Warum passiert das?
Das Gleiche gilt nicht für ganze Zahlen: int und uint32 führen zu einer Musterinstanziierung, und signiertes int führt zu einer anderen.
Der Grund liegt wahrscheinlich darin, dass C char behandelt, signiertes Zeichen und unsigniertes Zeichen als drei verschiedene Typen. Während int dasselbe ist wie signiert int. Stimmt das oder übersehe ich etwas?
<code class="cpp">#include <iostream> using namespace std; typedef signed char int8; typedef unsigned char uint8; typedef signed short int16; typedef unsigned short uint16; typedef signed int int32; typedef unsigned int uint32; typedef signed long long int64; typedef unsigned long long uint64; struct TrueType {}; struct FalseType {}; template <typename T> struct isX { typedef typename T::ikIsX ikIsX; }; // Это int==int32 неоднозначно //template <> struct isX<int > { typedef FalseType ikIsX; }; // Ошибка template <> struct isX<int32 > { typedef FalseType ikIsX; }; template <> struct isX<uint32 > { typedef FalseType ikIsX; }; // Почему это не двусмысленно? char==int8 template <> struct isX<char > { typedef FalseType ikIsX; }; template <> struct isX<int8 > { typedef FalseType ikIsX; }; template <> struct isX<uint8 > { typedef FalseType ikIsX; }; template <typename T> bool getIsTrue(); template <> bool getIsTrue<TrueType>() { return true; } template <> bool getIsTrue<FalseType>() { return false; } int main(int, char **t ) { cout << sizeof(int8) << endl; // 1 cout << sizeof(uint8) << endl; // 1 cout << sizeof(char) << endl; // 1 cout << getIsTrue< isX<int8>::ikIsX >() << endl; cout << getIsTrue< isX<uint8>::ikIsX >() << endl; cout << getIsTrue< isX<char>::ikIsX >() << endl; cout << getIsTrue< isX<int32>::ikIsX >() << endl; cout << getIsTrue< isX<uint32>::ikIsX >() << endl; cout << getIsTrue< isX<int>::ikIsX >() << endl; }
Ich verwende g 4.something
Das obige ist der detaillierte Inhalt vonIm Folgenden finden Sie englische Frage- und Antworttitel, die auf der Grundlage des von Ihnen bereitgestellten Artikelinhalts generiert wurden: Warum verhält sich „char' beim Vergleich von „char', „signed char' und „unsigned char' anders als ganzzahlige Typen bei der Vorlageninstanziierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!