C ++ 11中的char16_t和char32_t类型

时间:2014-01-06 20:02:45

标签: c++ gcc c++11 visual-studio-2013

据我所知,在C ++ 11中char16_tchar32_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_tchar32_t只是unsigned shortunsigned[..]\Microsoft Visual Studio 12.0\VC\include\yvals.h的typedef。

所以我查了一下

std::is_same<char32_t, unsigned>::value

在VS中为true,在gcc中为false

所以我的问题是:

  1. 标准中有char16_tchar32_t个新原语类型(这两种类型的VS实现是非标准的吗?)
  2. 这两种类型是gcc中的新原语类型,还是只是另一种typedef(但可能与VS中的typedef不同)?'
  3. VS计划在不久的将来将这些类型作为新的原始类型实现吗?

1 个答案:

答案 0 :(得分:5)

对于1:根据

,它们是不同的类型
  

3.9.1基本类型[basic.fundamental]

     

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

(强调我的)

这意味着GCC是正确的,VS是错误的。

For 2:GCC按预期实现它们,即作为不同的类型。

For 3:只有微软可以回答这个问题,但我认为他们可能会正确地实施这个问题。编译器供应商有时只是使用黑客作为解决方案来弥补差距,直到完整的解决方案准备就绪。