据我所知,在C ++ 11中char16_t
和char32_t
不是typedef,而是新的原始数据类型。 (如果我错了,请纠正我。)
我正在编写一个用于linux gcc和Windows Visual Studio的库。所以我写了一个特点:
template <class T>
struct IsChar : std::false_type {
};
template <>
struct IsChar<char> : std::true_type {
};
template <>
struct IsChar<wchar_t> : std::true_type {
};
template <>
struct IsChar<char16_t> : std::true_type {
};
template <>
struct IsChar<char32_t> : std::true_type {
};
但是,我注意到在VS(2013)中,char16_t
和char32_t
只是unsigned short
和unsigned
中[..]\Microsoft Visual Studio 12.0\VC\include\yvals.h
的typedef。
所以我查了一下
std::is_same<char32_t, unsigned>::value
在VS中为true
,在gcc中为false
。
所以我的问题是:
char16_t
和char32_t
个新原语类型(这两种类型的VS实现是非标准的吗?)答案 0 :(得分:5)
对于1:根据
,它们是不同的类型3.9.1基本类型[basic.fundamental]
5 类型
wchar_t
是一种不同的类型,其值可以表示支持的语言环境(22.3.1)中指定的最大扩展字符集的所有成员的不同代码。类型wchar_t
应具有与其他整数类型相同的大小,符号和对齐要求(3.11),称为基础类型。类型char16_t
和char32_t
分别表示不同类型,其大小,签名和对齐方式分别为uint_least16_t
和uint_least32_t
{{1} },称为基础类型。
(强调我的)
这意味着GCC是正确的,VS是错误的。
For 2:GCC按预期实现它们,即作为不同的类型。
For 3:只有微软可以回答这个问题,但我认为他们可能会正确地实施这个问题。编译器供应商有时只是使用黑客作为解决方案来弥补差距,直到完整的解决方案准备就绪。