char16_t
该标准似乎对包含无法表示的字符的文字有两种不同的响应char16_t
。首先,如果代码点值不能用 16 位表示(即它不在基本多语言平面 (BMP) 中),则程序格式错误(第 2.14.3/2 节):
char16_t
包含单个c-char的文字的值等于其 ISO 10646 代码点值,前提是该代码点可以用单个 16 位代码单元表示。(也就是说,只要它是一个基本的多语言平面代码点。)如果该值不能在 16 位内表示,则程序格式错误。
由于\U0001ABCD
是单个c-char 1但不在 BMP 中,因此包含它的程序格式错误。
好的,但稍后在同一章中,它说如果值超出实现定义的范围,char16_t
则文字具有实现定义的值(第 2.14.3/4 节):
如果字符文字的值超出为 [...] 定义的实现定义的范围
char16_t
(对于以 '<code>u' 为前缀的文字)[...] ,则它的值是实现定义的
由于实现定义的范围char16_t
必须至少为 16 位(以便能够存储整个 BMP),我们已经知道该程序对于超出该范围的值是非良构的。为什么标准会费心给它一个实现定义的值?
1产生规则是c-char -> universal-character-name -> \U
hex-quad hex-quad