为什么相同的类型不同?

时间:2011-04-06 12:22:19

标签: c++ metaprogramming

为什么这个(char在我的实现上签名):

cout << std::is_same< char,signed char>::value;

输出错误?

5 个答案:

答案 0 :(得分:6)

这三种类型是在不同时间引入的。

来自C99理性:

  

指定了三种char类型:
  signed,简单和unsigned。普通char可以表示为有符号或无符号   取决于实施,如在先前的实践中。类型signed char是   在C89中引入,在那些系统上提供一个单字节有符号整数类型   将char简化为unsigned char

他们必须在C ++中保持不同的类型,以允许char上的重载是可移植的。

答案 1 :(得分:4)

如果您使用的是Visual Studio,请参阅此处:http://msdn.microsoft.com/en-us/library/cc953fe1.aspx

  

C ++编译器处理的变量   键入char,签名 char和unsigned   char有不同的类型。   char类型的变量被提升为   int好像它们是由char类型签名的   默认情况下,除非/ J编译   使用选项。在这种情况下,他们是   被视为类型unsigned char并且是   无标志地提升为int   扩展

[编辑] 直接来自ISO C ++ 0x标准,第3.9.1段(第71页,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf):

  

可以显式声明字符   未签名或签名。简单的char,签名   char和unsigned char是三个   不同的类型。

答案 2 :(得分:2)

charsigned charunsigned char是三种不同类型,即使char的解释方式与{{1}相同}由您的编译器解释。

来自C ++标准的

§3.9.1/ 1

  

Plain char,signed char和unsigned char是三种不同类型。

换句话说,不要将signed char视为char的缩写形式,因为它不是。

只是为了强调类型如何不同尽管它们的位解释相同,请考虑以下两种结构:

signed char

它们一样吗?当然不是。完全相同,struct A { int i; }; struct B { int i; }; char是不同的类型。

试试这个:

signed char

答案 3 :(得分:1)

C ++标准(引用工作草案№3225,2010-11-27)

3.9.1基本类型

  

普通字符,签名字符和未签名字符   char是三种不同的类型。

答案 4 :(得分:0)

这取决于实现,但是如果我没记错的话,我会读到这两个应该不同的地方,以区分c类型字符串和8位有符号数。