在我之前的回答中,我回应了以下警告的原因,即'\u0B95'
需要三个字节,因此是一个多字符字面量:
warning: multi-character character constant [-Wmultichar]
但实际上,我认为我是错误的,gcc也是错误的。标准规定:
一个包含多个c-char的普通字符字面值是一个多字符字面值。
c-char的一个产生规则是通用字符名(即\uXXXX或\UXXXXXXXX)。由于\u0B95是一个单一的c-char,因此这不是一个多字符字面值。但现在变得混乱了。标准还说:
包含单个c-char的普通字符字面值具有char类型,其值等于执行字符集中c-char编码的数值。
所以我的字面量具有char类型和执行字符集中字符的值(如果该集合中不存在,则具有实现定义的值)。char只被定义为足够大,可以存储基本字符集的任何成员(该集合实际上未被标准定义,但我认为它指的是基本执行字符集):
声明为字符(char)的对象应足够大,以存储实现基本字符集中的任何成员。
因此,由于执行字符集是所有 char
可以容纳的值的超集,我的字符可能无法适合 char
中。
那么我的 char
具有什么值?这似乎没有定义在任何地方。标准确实说,对于 char16_t
字面量,如果该值不可表示,则程序是非法的。但它未提及普通字面量。
那么发生了什么?这只是标准中的混乱还是我错过了什么?
char
字面值的值是什么?或者它是一个多字符字面值吗?如果不能,如果实现定义的值无法存储在char
中,会怎样呢? - Joseph Mansfield