在布尔值上使用按位非运算符(〜)是否会调用未定义的行为?

Jer*_*ner 10 c++ bit-manipulation undefined-behavior language-lawyer

如果C++程序将bitwise-not运算符(〜)应用于布尔值,那么它是否会调用未定义的行为?

例如,以下程序定义明确吗?

bool f = false;
bool f2 = ~f;    // is f2 guaranteed to be true, or is this UB?
bool t = true;
bool t2 = ~t;    // is t2 guaranteed to be false, or is this UB?
Run Code Online (Sandbox Code Playgroud)

(是的,我知道有一个更适合这类事情的!运算符;出于这个问题的目的,我们将忽略它的存在;))

Igo*_*nik 8

5.3.1/10操作数~应具有整数或无范围的查点类型; 结果是其操作数的一个补码.执行整体促销.[强调我的]

4.5/6类型bool的prvalue可以转换为类型的prvalue int,false变为零并true成为一.

4.5/7这些转换称为整体促销.

所以~false是一种int与由全部为一的位模式-表示0,即全零的位模式的一的补码(根据需要由3.9.1/7同样,.)~trueint这1位表示的一的补码-即,所有具有最低有效位的零.这两个值都将true在布尔上下文中求值.