5

在我的系统上, 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_tandlong int是相同的类型(相同的属性,并且is_same为真)。

这种独特性是否wchar_t得到保证?在所有系统上wchar_t过载是否安全?int除了 int 之外,是否有任何属性可以区分wchar_t和相应的 int 属性is_same

(系统信息:我对一般情况感兴趣,但到目前为止我的测试是在运行 g++ 4.8.0 和 Apple clang++ 4.1 的 OS X 机器上进行的,两者都使用 -std=c++11。)

4

2 回答 2

9

是的,wchar_t保证是一个独特的类型(§3.9.1/5):

Typewchar_t是一种独特的类型,其值可以表示支持的语言环境 (22.3.1) 中指定的最大扩展字符集的所有成员的不同代码。

所以是的,在所有系统上过载都是安全wchar_tint

但是,wchar_t也保证与另一个整数类型(即其基础类型)具有相同的大小、符号和对齐要求。这不一定int,但在你的情况下似乎是。这wchar_t可能是使用其中一种整数类型实现的,但就您而言,它们被视为完全不同的类型。

于 2012-12-04T19:11:34.470 回答
8

是的,对于 C++11,wchar_t 是它自己的类型,与其他类型不同,但正如您所观察到的,它也将具有与其他类型相同的范围、符号等(§3.9.1/3 ):

wchar_t 类型是一种不同类型,其值可以表示支持的语言环境 (22.3.1) 中指定的最大扩展字符集的所有成员的不同代码。wchar_t 类型应具有与称为其基础类型的其他整数类型之一相同的大小、符号和对齐要求 (3.11)。

于 2012-12-04T19:12:44.457 回答