Maison  >  Article  >  développement back-end  >  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
Linda Hamiltonoriginal
2024-10-25 22:00:28925parcourir

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

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;

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;

}

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