12

注意:我敢肯定有人会称这是主观的,但我认为这是相当有形的。

C++11 为我们提供了新的basic_string类型std::u16string和,分别为和提供了std::u32string类型别名。std::basic_string<char16_t>std::basic_string<char32_t>

在这种情况下,子字符串的使用"u16""u32"我来说意味着“UTF-16”和“UTF-32”,这很愚蠢,因为C++当然没有文本编码的概念。

这些名称实际上反映了字符类型char16_tchar32_t,但这些名称似乎有误。它们无符号的,因为它们的底层类型是无符号的:

[C++11: 3.9.1/5]:[..] 类型char16_tchar32_t表示具有相同大小、符号和对齐方式的不同类型uint_least16_tuint_least32_t,分别 [..]

但在我看来,这些名称违反了这样的约定,即此类无符号类型的名称开头'u'为 ,并且使用诸如16unqualified 之类的数字之类的术语least表示固定宽度类型。

那么,我的问题是:我是在想象事物,还是这些名字从根本上存在缺陷?

4

3 回答 3

16

您引用的命名约定(uint32_t,int_fast32_t等)实际上仅用于typedefs,而不用于原始类型。原始整数类型是 {signed, unsigned} {char, short, int, long, long long}, {相对于浮点或十进制类型} ...

然而,除了这些整数类型之外,还有四种不同的、唯一的、基本类型、、、char和,wchar_t它们是各自文字的类型、、和用于字母数字类型数据,类似地用于那些. 这些类型当然也是整数类型,因此它们在某些算术整数类型中具有相同的布局,但是语言在前者、算术类型(您将用于计算)和后者之间做出了非常明确的区分“字符”类型,形成某种类型的 I/O 数据的基本单元。char16_tchar32_t''L''u''U''

(我之前曾在这里这里讨论过这些新类型。)

所以,我认为char16_t并且char32_t实际上非常恰当地命名以反映它们属于整数类型的“char”系列的事实。

于 2012-10-09T10:54:31.737 回答
4

这些名字有根本缺陷吗?

(我认为这个问题的大部分已经在评论中得到了回答,但要做出回答)不,一点也不。char16_t并且char32_t是为特定目的而创建的。为所有 Unicode 编码格式提供数据类型支持(UTF-8 包含在 中char),同时保持它们尽可能通用,而不是将它们限制为仅 Unicode。它们是无符号还是具有固定宽度与它们是什么没有直接关系:字符数据类型。保存和表示字符的类型。有符号性是表示数字而非字符的数据类型的属性。这些类型旨在存储字符,基于 16 位或 32 位的字符数据,不多也不少。

于 2012-10-09T02:42:42.827 回答
-3

根据定义,它们没有根本性的缺陷——它们是标准的一部分。如果这冒犯了你的情感,那么你必须找到一种方法来处理它。提出这一论点的时间是在最新标准获得批准之前,而那个时间已经过去了。

于 2012-10-09T02:24:25.793 回答