C++ 为什么wchar_t/unsigned short现在是不同的,但是没有类似的char/unsigned byte区别?

C++ 为什么wchar_t/unsigned short现在是不同的,但是没有类似的char/unsigned byte区别?,c++,c++11,c++14,wchar-t,C++,C++11,C++14,Wchar T,在这里的设计中,它看起来像是“没有一个想法”,因为16位的整数数据和字符数据现在是可微的,而8位的整数和字符数据则不是 对于8位值,C++一直是唯一的选择。但是将wchar\u t识别为官方的、不同于无符号短字符的类型的功能可以实现改进,但仅适用于宽字符串用户。这似乎是不协调的,;对于8位和16位值,该语言的行为不同 我认为拥有更独特的类型有明显的价值;具有不同的8位字符和8位“字节”会更好,例如,在用于运算符重载时。例如: // This kind of sucks... BYTE m = 5

在这里的设计中,它看起来像是“没有一个想法”,因为16位的整数数据和字符数据现在是可微的,而8位的整数和字符数据则不是

对于8位值,C++一直是唯一的选择。但是将wchar\u t识别为官方的、不同于无符号短字符的类型的功能可以实现改进,但仅适用于宽字符串用户。这似乎是不协调的,;对于8位和16位值,该语言的行为不同

我认为拥有更独特的类型有明显的价值;具有不同的8位字符和8位“字节”会更好,例如,在用于运算符重载时。例如:

// This kind of sucks...
BYTE m = 59;     // This is really 'unsigned char' because there is no other option
cout << m;       // outputs character data ";" because it assumes 8-bits is char data.
                 // This is a consequence of limited ability to overload

// But for wide strings, the behavior is different and better...
unsigned short s = 59;
wcout << s;      // Prints the number "59" like we expect
wchar_t w = L'C'
wcout << w;      // Prints out "C" like we expect
//这种东西太差劲了。。。
字节m=59;//这实际上是“unsigned char”,因为没有其他选项

可能是的,但使用非字符的单字节整数是非常罕见的,您可以通过整数提升轻松地绕过您所述的问题(尝试应用一元数
+
,看看会发生什么)


还有一点值得注意的是,你的前提是有缺陷的:
wchar\u t
无符号short
在C++98、C++03、C++11和C++14中的段落
3.9.1/5
一直是不同的类型。

如果我告诉你
wchar\u t
不需要16位,你会不会大吃一惊?甚至在一个确定的
CHAR\u BIT==8
环境中是2个字节?或者
wchar\u t
/
无符号short
一直是不同的?我想wchar\u t有多宽并不重要,关键是,它不能与整数混淆,不像CHAR。此外,char16_t和char32_t也是一样。16位
wchar_t
听起来像是一个可怕的替代现实。如果你从头开始设计语言,不考虑向后兼容性,那么使用(有一种可能)模板式表示法会有很多话要说,所以你可以有
int
char
,其中
N
可以是从8到至少64的任意2次幂。只有两个名称,您就可以提供所有的
char
short
int
long
、和
long
,而且它将是简单而系统的,因此整数和字符类型之间的区别将与大小无关。没有发生过,而且考虑到向后兼容的限制,它可能也不会发生。只是今天我想输出一些字节作为十六进制数,发现自己正在查看一个包含笑脸和奇怪字母的文本文件。@NeilKirk:是的,我偶尔会看到。我不认为(天哪,你能想象一个新的
byte
关键字的向后兼容性噩梦吗?
byte\u t
也许是ew,为什么这与
char
不一样?天哪,这太可怕了)。。。是的,我只是在附加说明中找到了一些理由。除此之外,必须有一个很好的理由为语言添加一些东西,而不是相反。虽然我会很惊讶,如果这还没有被提出。关键是,这里没有可回答的问题。问题是整数类型是一个模板参数,我想将整数输出到流。我想我可以把+放在上面,但我没想到。@NeilKirk:我就是这么做的。不太理想,我承认。谢谢你的提示,这真的能帮我明天整理一些代码。