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实现是定义有符号还是无符号)。
通过非混叠类型实现更好的性能;优化器可以更好地优化不别名其他类型的类型。