N4267提出的这些究竟有什么意义?
它们的唯一功能似乎是防止指定扩展的 ASCII 字符或部分 UTF-8 代码点。它们仍然存储在固定宽度的 8 位字符中(据我了解,对于几乎所有用例来说,这是处理 UTF-8 的正确和最佳方式),因此它们不支持非 ASCII 字符全部。到底是怎么回事?
(实际上我也不完全确定我是否理解对 UTF-8 字符串文字的需求。我猜这是编译器担心使用 Unicode 字符串加上 Unicode 验证做奇怪/模棱两可的事情?)
进化工作组第 119 期中涵盖了基本原理:N4197 添加 u8 字符文字,[小] 为什么没有 u8 字符文字?它跟踪了提案并说:
我们有五个用于字符串文字的编码前缀(无、L、u8、u、U),但只有四个用于字符文字——缺少的一个是用于字符文字的 u8。
这对于窄执行字符集不是 ASCII 的实现很重要。在这种情况下,u8 字符文字将提供一种理想的方式来编写具有保证 ASCII 编码的字符文字(单代码单元 u8 编码正是 ASCII),但是......我们不提供它们。相反,最好的办法是这样的:
char x_ascii = { u'x' };
...如果代码点不适合“字符”,我们将得到一个缩小错误。(请注意,这与 u8'x' 不太一样,如果代码点在 UTF-8 中不能表示为单个代码单元,则会给我们一个错误。)