Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “char16”和“char32”是否用词不当?_C++_C++11_Language Lawyer - Fatal编程技术网

C++ “char16”和“char32”是否用词不当?

C++ “char16”和“char32”是否用词不当?,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,NB:我肯定有人会说这是主观的,但我认为这是相当具体的 C++11为我们提供了新的basic_字符串类型std::u16string和std::u32string,分别为std::basic_字符串和std::basic_字符串提供了类型别名 “在C++中使用子串”U16“ >和”U32“< /代码>”,这意味着“UTF 16”和“UTF 32”,这将是愚蠢的,因为C++当然没有文本编码的概念。 这些名称实际上反映了字符类型char16\u t和char32\u t,但它们似乎命名错误。由于其基

NB:我肯定有人会说这是主观的,但我认为这是相当具体的

C++11为我们提供了新的
basic_字符串
类型
std::u16string
std::u32string
,分别为
std::basic_字符串
std::basic_字符串
提供了类型别名

“在C++中使用子串<代码>”U16“<代码> >和<代码>”U32“< /代码>”,这意味着“UTF 16”和“UTF 32”,这将是愚蠢的,因为C++当然没有文本编码的概念。 这些名称实际上反映了字符类型
char16\u t
char32\u t
,但它们似乎命名错误。由于其基础类型的无符号性,它们是无符号的:

[C++11:3.9.1/5]:
[…]类型
char16\u t
char32\u t
分别表示与
uint\u least16\u t
uint\u least32\u t
具有相同大小、符号和对齐方式的不同类型[…]

但在我看来,这些名称违反了这样一种约定,即此类无符号类型的名称以
'u'
开头,并且使用
16
等数字表示固定宽度类型,而
least
等术语不限定这些名称


那么,我的问题是:我是在想象什么,还是这些名字有根本性的缺陷?

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

这些名字根本上有缺陷吗


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

您引用的命名约定(
uint32\u t
int\u fast32\u t
等)实际上只用于typedef,而不用于基本类型。基本整数类型是{有符号、无符号}{char、short、int、long、long},{与float或decimal类型相反}

然而,除了这些整数类型之外,还有四种不同的、唯一的基本类型,
char
wchar\u t
char16\u t
char32\u t
,它们是各自的文本
'
L'
的类型,
u''
u''
和用于字母数字类型的数据,同样用于这些类型的数组。这些类型当然也是整数类型,因此它们在某些算术整数类型中具有相同的布局,但语言对前者、算术类型(用于计算)和后一种“字符”类型(构成某些类型的I/O数据的基本单元)进行了非常明确的区分

(我以前曾漫谈过这些新类型和新特性。)


因此,我认为
char16\u t
char32\u t
实际上是非常恰当的命名,以反映它们属于整数类型的“char”家族。

“我不知道ISO/IEC是否正确,也不知道ISO/IEC是否错误。但我们所知道的是,谁的编译失败了,谁的类型就很强。(并且,CAR16HT是一个CHAR32…t,而CHAR32是T的,是未签名的long)。“这个答案的第一句话暗示了C++语言标准中没有任何缺陷。这是一个大胆的说法,我不知道很多知情人士会同意。“提出这一论点的时间是在最新标准被批准之前,而这一时间早已过去。"不是真的-它不像C++11将是最后一个。你是说所有关于C++03缺陷的争论当时都应该沉默吗?@JamesMcNellis,这个问题提出了一个大胆的主张,要求大胆的回答。不管你怎么想,它都是标准,这部分不会改变。@LightnessRacesin轨道,这是我观点的一部分-这里几乎不需要技术解释,因为这只是一个命名约定。类型将是他们自己,无论他们被称为什么。它不会上升到“基本缺陷”的水平除非它在标准中产生逻辑矛盾。这种解释认为
char16\u t
char32\u t
属于不同的“家族”这些类型相当巧妙地围绕着我认为仍然是一个有点误导性的标准。这就行了!谢谢。代码< CAR16> T/<代码>和<代码> CHAR32×T/<代码>是C中的Type Debug,C++使它们成为原始类型,允许重载。@ JeSeGoo:为什么你会这样想?检查C11 7.28。@ ColinDBennett:“primitive”是一种口语,不在标准中。标准只定义“Basic”类型。@ColinDBennett:类型和类型名之间有区别。对象类型只有Basic、compound或user-defined,但类型名可以是内置的,也可以是user-defined类型的名称(用类键声明的东西),或声明的类型别名(使用或
typedef
声明的对象)。据我所知,没有“名称特征”可以告诉您名称是否是某个对象或别名的原始名称。就行为而言,宽度真正影响的唯一东西是溢出模2ᴺ. 但是加法和减法是很重要的