在我的系统上,wchar_t和int是具有相同属性的不同类型:
#include <type_traits>
sizeof(wchar_t) == sizeof(int) == 4
std::is_signed<wchar_t> == std::is_signed<int> == std::true_type
std::is_same<wchar_t, int> == std::false_type
相比之下,ptrdiff_t
和long int
是相同的类型(相同的属性,is_same
为真)。
wchar_t
的这种独特性是否得到保证?在所有系统上wchar_t
和int
重载是否安全?除了wchar_t
之外,是否有任何属性可以区分is_same
和相应的int属性?
(系统信息:我对一般情况感兴趣,但到目前为止,我的测试是在运行g ++ 4.8.0和Apple clang ++ 4.1的OS X机器上,两者都使用-std = c ++ 11。)< / p>
答案 0 :(得分:9)
是的,wchar_t
保证是一种独特的类型(§3.9.1/ 5):
类型
wchar_t
是一种不同的类型,其值可以表示支持的语言环境(22.3.1)中指定的最大扩展字符集的所有成员的不同代码。
是的,在所有系统上对wchar_t
和int
重载是安全的。
但是,wchar_t
也保证具有与另一个整数类型相同的大小,符号和对齐要求,即底层类型。这不一定是int
,但在您的情况下似乎是wchar_t
。这意味着{{1}}可能是使用其中一种整数类型实现的,但就您而言,它们被视为完全不同的类型。
答案 1 :(得分:8)
是的,对于C ++ 11,wchar_t是它自己的类型,与其他类型不同,但正如您所观察到的,它也将具有与其他类型相同的范围,签名等(§3.9。 1/3):
类型wchar_t是一种不同的类型,其值可以表示支持的语言环境(22.3.1)中指定的最大扩展字符集的所有成员的不同代码。类型wchar_t应具有与其他整数类型相同的大小,符号和对齐要求(3.11),称为其基础 类型。