编译器是否应该将bool中的任意非零值正确解释为true?

时间:2015-12-30 03:24:32

标签: c++ boolean language-lawyer

Bool应该转换为1表示真值,否则为0。但是,它没有说明它们实际上如何存储在内存中。如果我在bool中存储任意非零值会发生什么?标准是否保证在将它们转换为整数时的正确行为?

例如,给定以下程序,

#include <string.h>

int main()
{
  bool b;
  memset( &b, 123, sizeof( b ) );

  return b;
}

标准是否保证程序会返回1?

1 个答案:

答案 0 :(得分:4)

不,在memset之后从那个bool读取(至少见下文)未指定的行为,因此不能保证将返回什么值。

可能会发现,在特定架构中,bool的值表示仅由高位组成,在这种情况下,通过广播123在{的字节上产生的值{1}}将成为bool的代表。

C ++标准没有指定代表值falsetrue的实际位模式。实现可以使用false的对象表示中的任何或所有位 - 必须至少为一个字节,但可能更长 - 并且它可以将多个位模式映射到相同的值:

§3.9.1[basic.fundamental] / 1:

  

...对于窄字符类型,对象表示的所有位都参与值表示。对于无符号窄字符类型,值表示的每个可能位模式表示不同的数字。这些要求不适用于其他类型。

同一部分的第6段要求bool类型的值为booltrue,但脚注指出面对未定义的行为时{{1} “可能表现得好像既不是真也不是假。” (这显然是在未定义行为的范围内;如果一个程序展示了UB,那么即使在证明UB之前,它的执行也没有任何要求。)

标准中没有任何内容允许对除窄字符数组之外的对象使用低级别内存复制操作,除了对象可以轻易复制并且通过将对象表示复制到缓冲区并稍后恢复来保存对象表示的情况通过复制它。任何其他使用C库函数覆盖对象表示中的任意字节的应用程序都应该通过未定义行为的一般定义来定义(“[标准]省略任何明确的行为定义”)。但是我不得不同意没有明确声明false是UB,所以我会解决未明确的行为,这似乎很清楚,因为bool的表示肯定是未指定的。 / p>