C++11中的char16_t和char32_t类型

3

据我所知,在C++11中,char16_tchar32_t不是typedefs,而是新的原始数据类型。(如果我有误,请纠正我)。

我正在编写一个库,旨在用于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只是[..]\Microsoft Visual Studio 12.0\VC\include\yvals.h中的unsigned shortunsigned的typedefs。

所以我进行了检查,

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

在VS中为true,在gcc中为false

所以我的问题是:

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

不仅char16_tchar32_t是不同的类型,而且signed charunsigned char也与char不同。http://coliru.stacked-crooked.com/a/0851febbf71772dd - Praetorian
3
Visual C++编译器目前还不支持char16_tchar32_t类型。在它支持之前,我们在库中使用typedefs。 - James McNellis
1个回答

5
对于第一点:它们是不同的类型,根据基本类型[ basic.fundamental] 3.9.1。 wchar_t 是一个独特的类型,其值可以表示在所有受支持语言环境中指定的最大扩展字符集的所有成员的不同代码(22.3.1)。 wchar_t 的大小,符号和对齐要求(3.11)应与其他整数类型之一相同,称为其基础类型。 char16_t 和 char32_t 分别代表具有与 uint_least16_t 和 uint_least32_t 相同大小,符号和对齐方式的不同类型,在中称为底层类型。
对于第二点:GCC按照意图实现了它们,即作为不同的类型。
对于第三点:只有微软能够回答这个问题,但我认为他们很可能会正确实现它们。编译器供应商有时会使用黑客方法来弥补差距,直到完整的解决方案准备就绪。

“in” 是什么?包括 <> 的标题名称看起来像标签,会被剥离。 :) - user743382
@hvd 谢谢,已修复 :) - Daniel Frey
有趣。你是从哪里读取的?我看到的是<stdint.h>而不是<cstdint>(虽然意思相同)。 - user743382
@hvd n3797,虽然不是官方标准,但在我看来已经足够接近了 :) - Daniel Frey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接