Nat*_*ica 39
char8_t
与char
。它的行为完全一样unsigned char
虽然每[basic.fundamental] / 9
Type
char8_t
表示其基础类型为的不同类型unsigned char
。类型char16_t
和char32_t
分别表示不同的类型,其基本类型uint_least16_t
和uint_least32_t
分别为,在<cstdint>.
重点矿
请注意,由于该标准将其称为不同类型,因此代码类似于
std::cout << std::is_same_v<unsigned char, char8_t>;
Run Code Online (Sandbox Code Playgroud)
0
即使char8_t
已实现为,也会打印(false)unsigned char
。这是因为它不是别名,而是不同的类型。
要注意的另一件事是,char
可以将其实现为signed char
或unsigned char
。这意味着可能char
具有与相同的范围和表示形式char8_t
,但是它们仍然是单独的类型。 char
,signed char
,unsigned char
,和char8_t
大小相同,但它们是完全不同的类型。
Tom*_*ann 18
免责声明:我是char8_t
P0482和P1423提案的作者。
在C ++ 20中,char8_t
是与所有其他类型不同的类型。在用于C,相关提案N2231(这是需要的更新和重新提议WG14的),char8_t
将是一个typedef unsigned char
类似于用于现有的typedef char16_t
和char32_t
。
在C ++ 20中,char8_t
具有匹配的基础表示unsigned char
。因此,它的大小(至少8位,但可能更大),对齐方式和整数转换等级与相同unsigned char
,但具有不同的别名规则。
特别是,char8_t
未将其添加到[basic.lval] p11的类型列表中。[basic.life] p6.4,[basic.types] p2或[basic.types] p4。这意味着,不同于unsigned char
,它不能用于其他类型的对象的基础存储,也不能用于检查其他类型的对象的基础表示。换句话说,它不能用于别名其他类型。这样做的结果是该类型的对象char8_t
可以通过指针被访问以char
或unsigned char
,但指针char8_t
不能用于访问char
或unsigned char
数据。换一种说法:
reinterpret_cast<const char *>(u8"text"); // Ok.
reinterpret_cast<const char8_t*>("text"); // Undefined behavior.
Run Code Online (Sandbox Code Playgroud)
具有这些属性的独特类型的动机是:
为UTF-8字符数据和字符数据提供不同的类型,其编码取决于语言环境或需要单独的规范。
为普通字符串文字和UTF-8字符串文字启用重载(因为它们可能具有不同的编码)。
确保UTF-8数据的无符号类型(char
实现是定义有符号还是无符号)。
通过非混叠类型实现更好的性能;优化器可以更好地优化不别名其他类型的类型。