wchar_t保证与任何整数类型不同

Is wchar_t guaranteed to be distinct from any integer type?

本文关键字:整数 类型 任何 wchar      更新时间:2023-10-16

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

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

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

是的,wchar_t保证是不同的类型 (§3.9.1/5):

类型 wchar_t 是一种非重复类型,其值可以表示在受支持的区域设置 (22.3.1) 中指定的最大扩展字符集的所有成员的不同代码。

所以是的,在所有系统上重载wchar_tint是安全的。

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

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

类型 wchar_t 是一种非重复类型,其值可以表示在受支持的区域设置 (22.3.1) 中指定的最大扩展字符集的所有成员的不同代码。类型 wchar_t 应具有与其他整体类型之一(称为其基础)相同的大小、符号和对齐要求 (3.11) 类型。