perbezaan dalam tingkah laku antara char, char yang ditandatangani dan char yang tidak ditandatangani
Kod di bawah berjaya menyusun, tetapi char berkelakuan berbeza daripada jenis integer.
cout << getIsTrue< isX<int8>::ikIsX >() << endl; cout << getIsTrue< isX<uint8>::ikIsX >() << endl; cout << getIsTrue< isX<char>::ikIsX >() << endl;
Hasilnya ialah tiga corak instantiasi untuk tiga jenis: int8, uint8 dan char. Mengapa ini berlaku?
Perkara yang sama tidak berlaku untuk integer: int dan uint32 menghasilkan satu instantiasi corak, dan int yang ditandatangani menghasilkan yang lain.
Alasannya mungkin kerana C merawat char , char yang ditandatangani dan char yang tidak ditandatangani sebagai tiga jenis yang berbeza. Manakala int adalah sama seperti int yang ditandatangani. Adakah ini benar atau saya terlepas sesuatu?
<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; }
Saya menggunakan g 4.sesuatu
Atas ialah kandungan terperinci Berikut ialah tajuk soalan dan jawapan bahasa Inggeris yang dijana berdasarkan kandungan artikel yang anda berikan: Mengapakah `char` berkelakuan berbeza daripada jenis integer dalam instantiasi templat apabila membandingkan `char`, `signed char` dan `unsigned char`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!