标准似乎对包含char16_t
无法表示的字符的char16_t
文字有两种不同的回答。首先,如果代码点值不能用16位表示(即它不在基本多语言平面(BMP)中),那么程序就是格式错误(§2.14.3/ 2):
包含单个 c-char 的
char16_t
文字的值等于其ISO 10646代码点值,前提是代码点可用单个16位代码表示单元。 (即,如果它是一个基本的多语言平面代码点。)如果该值不能在16位内表示,则程序格式不正确。
由于\U0001ABCD
是单个 c-char 1 但不在BMP中,因此包含它的程序格式不正确。
好的,但稍后在同一章中,它表示如果值超出实现定义的char16_t
范围,则文字具有实现定义的值(§2.14.3/ 4):
字符文字的值是实现定义的,如果它超出为[...]
char16_t
定义的实现定义范围(对于以'u
'为前缀的文字)[。 ..]
由于char16_t
的实现定义范围必须至少为16位(能够存储整个BMP),我们已经知道该程序的格式不正确,因为该值超出了该范围。为什么标准会给它一个实现定义的值呢?
1 制作规则是 c-char - > 通用字符名称 - > \U
hex-quad hex-quad
答案 0 :(得分:0)
该程序根据2.14.3 / 2格式不正确,这意味着必须诊断错误。没有必要进一步分析,因为完成编译或生成可执行文件不需要实现。文字可能被认为仍然有价值,但它几乎不重要。
(虽然允许实现编译和执行格式错误的程序。所以我认为在这种情况下,字符文字仍被指定为具有值的事实很重要。)