你'U0001ABCD'是否具有实现定义的值或是否格式错误?

时间:2012-11-25 20:00:34

标签: c++ character-encoding c++11 standards literals

标准似乎对包含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

1 个答案:

答案 0 :(得分:0)

该程序根据2.14.3 / 2格式不正确,这意味着必须诊断错误。没有必要进一步分析,因为完成编译或生成可执行文件不需要实现。文字可能被认为仍然有价值,但它几乎不重要。

(虽然允许实现编译和执行格式错误的程序。所以我认为在这种情况下,字符文字仍被指定为具有值的事实很重要。)