NB:我确信有人会称之为主观,但我认为这是相当有形的。
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_t
和char32_t
,但这些名称似乎错误。由于其基础类型的无符号性,它们 无符号:
[C++11: 3.9.1/5]:
[..]类型char16_t
和char32_t
分别表示具有相同大小,签名和对齐方式的不同类型uint_least16_t
和uint_least32_t
[..]
但在我看来,这些名称违反了这样的惯例,即此类无符号类型的名称以'u'
开头,并且16
等数字的使用不符合least
这样的术语固定宽度类型。
我的问题是:我想象的是,或者这些名字是否存在根本缺陷?
答案 0 :(得分:13)
您引用的命名约定(uint32_t
,int_fast32_t
等)实际上仅用于 typedefs ,而不用于基本类型。原始整数类型是{signed,unsigned} {char,short,int,long,long long},{而不是float或decimal类型} ...
但是,除了这些整数类型之外,还有四个不同,唯一的基本类型,char
,wchar_t
,char16_t
和{{1 }},它们是各自文字char32_t
,''
,L''
和u''
的类型,用于字母数字类型数据,类似于那些数组的数组。那些类型当然也是整数类型,因此它们在算术整数类型的某些处将具有相同的布局,但是该语言在前者的算术类型之间做了非常清楚的区分(你会用于计算)和后面的“字符”类型,它们构成了某种I / O数据的基本单元。
所以,我认为U''
和char16_t
实际上非常恰当地命名,以反映它们属于整数类型的“char”族。
答案 1 :(得分:4)
这些名字是否存在根本缺陷?
(我认为这个问题的大部分已在评论中得到解答,但要回答)不,一点也不。 char16_t
和char32_t
是为特定目的而创建的。为所有Unicode编码格式提供数据类型支持(char
涵盖UTF-8),同时尽可能保持通用,不要将它们仅限制为Unicode。它们是无符号还是具有固定宽度与它们的含义没有直接关系:字符数据类型。保持并代表characters的类型。签名是表示数字而不是字符的数据类型的属性。这些类型意味着存储字符,无论是基于16位还是32位的字符数据,都没有或多或少。
答案 2 :(得分:-3)
根据定义,它们不根本上存在缺陷 - 它们是标准的一部分。如果这会冒犯你的感情,那么你必须找到一种方法来处理它。提出这一论点的时间是在批准最新标准之前,那个时间早已过去了。