是`char16_t`和`char32_t`用词不当?

时间:2012-10-08 20:58:23

标签: c++ c++11 language-lawyer

NB:我确信有人会称之为主观,但我认为这是相当有形的。

C ++ 11为我们提供了新的basic_string类型std::u16stringstd::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'开头,并且16等数字的使用不符合least这样的术语固定宽度类型。

我的问题是:我想象的是,或者这些名字是否存在根本缺陷?

3 个答案:

答案 0 :(得分:13)

您引用的命名约定(uint32_tint_fast32_t等)实际上仅用于 typedefs ,而不用于基本类型。原始整数类型是{signed,unsigned} {char,short,int,long,long long},{而不是float或decimal类型} ...

但是,除了这些整数类型之外,还有四个不同,唯一的基本类型,charwchar_tchar16_t和{{1 }},它们是各自文字char32_t''L''u''的类型,用于字母数字类型数据,类似于那些数组的数组。那些类型当然也是整数类型,因此它们在算术整数类型的某些处将具有相同的布局,但是该语言在前者的算术类型之间做了非常清楚的区分(你会用于计算)和后面的“字符”类型,它们构成了某种I / O数据的基本单元。

(我之前对这些新类型herehere进行过漫步。)

所以,我认为U''char16_t实际上非常恰当地命名,以反映它们属于整数类型的“char”族。

答案 1 :(得分:4)

  

这些名字是否存在根本缺陷?

(我认为这个问题的大部分已在评论中得到解答,但要回答)不,一点也不。 char16_tchar32_t是为特定目的而创建的。为所有Unicode编码格式提供数据类型支持(char涵盖UTF-8),同时尽可能保持通用,不要将它们仅限制为Unicode。它们是无符号还是具有固定宽度与它们的含义没有直接关系:字符数据类型。保持并代表characters的类型。签名是表示数字而不是字符的数据类型的属性。这些类型意味着存储字符,无论是基于16位还是32位的字符数据,都没有或多或少。

答案 2 :(得分:-3)

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