README
“陷阱值”或“陷阱表示”是指类型T的底层存储的一种位组合,它产生了一个无效的T值。尝试解释无效值的表示将导致“未定义行为”。
让战斗开始..
又有一个问题引发了有关char
以及其可能具有陷阱表示的激烈讨论。
问题:
char
是否可能具有陷阱值?
在先前的讨论中提到的引用:
这些部分是先前争论中最常引用的部分,它们是否相互矛盾?
3.9.1p1
基本类型[basic.fundamental]
实现定义了
char
是否可以持有负值。字符可以明确声明为signed
或unsigned
。
char
、signed char
和unsigned char
占用相同的存储空间,并具有相同的对齐要求(3.11);也就是说,它们具有相同的对象表示。对于字符类型,对象表示的所有位都参与值表示。对于无符号字符类型,值表示的所有可能位模式都表示数字。这些要求不适用于其他类型。
在任何特定实现中,普通的
char
对象可以采用与signed char
或unsigned char
相同的值;哪一个是实现定义的。
3.9p2 类型
[basic.types]
对于任何平凡可复制类型
T
的对象(除了基类子对象),无论对象是否持有类型T
的有效值,组成对象的底层字节(1.7)都可以复制到char
或unsigned char
数组中。如果将
char
或unsigned char
数组的内容复制回对象,则对象随后应保持其原始值。
char
和signed char
也是如此。 - Tony Delroy