char!=(signed char),char!=(unsigned char)

下面的代码编译,但chartypes的行为比inttypes的行为不同。

尤其是

cout << getIsTrue< isX<int8>::ikIsX >() << endl; cout << getIsTrue< isX<uint8>::ikIsX >() << endl; cout << getIsTrue< isX<char>::ikIsX >() << endl; 

导致3种types的实例化模板:int8,uint8和char。 是什么赋予了?

ints:int和uint32的结果是相同的模板实例化,并且另一个int是有符号的。

原因似乎是C ++将char,signed char和unsigned char看作三种不同的types。 int和signed int是一样的。 这是对的还是我错过了什么?

 #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; }; // This int==int32 is ambiguous //template <> struct isX<int > { typedef FalseType ikIsX; }; // Fails template <> struct isX<int32 > { typedef FalseType ikIsX; }; template <> struct isX<uint32 > { typedef FalseType ikIsX; }; // Whay isn't this ambiguous? 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

这是你从标准的答案:

3.9.1基本types[basic.fundamental]

1声明为字符字符的对象)应该足够大以存储实现基本字符集的任何成员。 如果来自该组的字符存储在字符对象中,则该字符对象的整数值等于该字符的单个字符字面值forms的值。 char对象是否可以保存负值是实现定义的。 字符可以显式地声明为无符号或有符号的。 Plain char,signed char和unsigned char是三种不同的types。 char,signed char和unsigned char占用相同的存储量,并具有相同的alignment要求( basic.types ); 也就是说,它们具有相同的对象表示。 对于字符types,对象表示的所有位都参与到值表示中。 对于无符号字符types,值表示的所有可能位模式都表示数字。 这些要求不适用于其他types。 在任何特定的实现中,一个普通的char对象可以采用与signed char或unsigned char相同的值; 哪一个是实现定义的。

对于这样的问题,我喜欢查看C的基本原理文档,这个文档通常也提供了C ++解密的答案,有时在阅读标准时也会出现。 有这样的说法:

指定了三种types的字符:signed,plain和unsigned。 一个普通的字符可以表示为有符号的或无符号的,这取决于实施方式,如在先前的实践中那样。 引入typessigned char是为了在实现普通字符为unsigned的系统上提供一个字节的有符号整数types。 出于对称的原因,被签名的关键字被允许作为其他整型的types名称的一部分。

C的基本原理

虽然像shortint这样的大多数int默认被signed ,但char在C ++中没有默认标牌。

C ++程序员在使用char作为8位整数types时遇到了一个常见的错误。

这是正确的, charunsigned charsigned char是不同的types。 如果charsigned charunsigned char的同义词,取决于编译器的实现,它可能会很好,但标准说它们是不同的types。