ホームページ > バックエンド開発 > C++ > 以下は、提供された記事の内容に基づいて生成された英語の質問と回答のタイトルです。 テンプレートのインスタンス化において、「char」、「signed char」、および「unsigned char」を比較するときに、「char」の動作が整数型とは異なるのはなぜですか?

以下は、提供された記事の内容に基づいて生成された英語の質問と回答のタイトルです。 テンプレートのインスタンス化において、「char」、「signed char」、および「unsigned char」を比較するときに、「char」の動作が整数型とは異なるのはなぜですか?

Linda Hamilton
リリース: 2024-10-25 22:00:28
オリジナル
994 人が閲覧しました

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

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

char、signed char、unsigned char の動作の違い

以下のコードは正常にコンパイルされますが、char は整数型とは動作が異なります。

cout << getIsTrue< isX<int8>::ikIsX  >() << endl;
cout << getIsTrue< isX<uint8>::ikIsX  >() << endl;
cout << getIsTrue< isX<char>::ikIsX  >() << endl;
ログイン後にコピー

結果は、int8、uint8、char の 3 つの型に対する 3 つのインスタンス化パターンになります。なぜこのようなことが起こるのでしょうか?

同じことは整数にも当てはまりません。int と uint32 では 1 つのパターンのインスタンス化が行われ、signed int では別のパターンのインスタンス化が行われます。

その理由は、おそらく C が char を扱うためです。 signed char と unsigned char の 3 つの異なるタイプ。一方、int は signed int と同じです。これは本当ですか?それとも何かが足りないのでしょうか?

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

}
ログイン後にコピー

私は g 4.something を使用しています

以上が以下は、提供された記事の内容に基づいて生成された英語の質問と回答のタイトルです。 テンプレートのインスタンス化において、「char」、「signed char」、および「unsigned char」を比較するときに、「char」の動作が整数型とは異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート