Maison > développement back-end > C++ > Voici les titres de questions et réponses en anglais générés en fonction du contenu de l'article que vous avez fourni : Pourquoi « char » se comporte-t-il différemment des types entiers dans l'instanciation de modèle lorsque l'on compare « char », « signé char » et « unsigned char » ?

Voici les titres de questions et réponses en anglais générés en fonction du contenu de l'article que vous avez fourni : Pourquoi « char » se comporte-t-il différemment des types entiers dans l'instanciation de modèle lorsque l'on compare « char », « signé char » et « unsigned char » ?

Linda Hamilton
Libérer: 2024-10-25 22:00:28
original
1042 Les gens l'ont consulté

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

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

différences de comportement entre les caractères char, signé et non signé

Le code ci-dessous se compile avec succès, mais char se comporte différemment des types entiers.

cout << getIsTrue< isX<int8>::ikIsX  >() << endl;
cout << getIsTrue< isX<uint8>::ikIsX  >() << endl;
cout << getIsTrue< isX<char>::ikIsX  >() << endl;
Copier après la connexion

Le résultat est trois modèles d'instanciation pour trois types : int8, uint8 et char. Pourquoi cela se produit-il ?

La même chose n'est pas vraie pour les entiers : int et uint32 aboutissent à une instanciation de modèle, et signé int en entraîne une autre.

La raison est probablement parce que C traite char , les caractères signés et les caractères non signés sont trois types différents. Tandis que int est identique à signé int. Est-ce vrai ou est-ce que j'ai raté quelque chose ?

<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;

}
Copier après la connexion

J'utilise g 4.something

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal