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`?

Linda Hamilton
Lepaskan: 2024-10-25 22:00:28
asal
924 orang telah melayarinya

以下是根据您提供的文章内容生成的英文问答类标题:

Why does `char` behave differently from integer types in template instantiation when comparing `char`, `signed char`, and `unsigned char`?

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;
Salin selepas log masuk

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;

}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!