C++で~trueがtrueになる理由——gccの奇妙なバグと未定義動作の罠

The complement of true is true, except when it's false

C++で~trueがtrueになる理由——gccの奇妙なバグと未定義動作の罠

C++の整数昇格とブール変換を組み合わせると、~trueをboolにキャストした結果がtrueになる。さらに、boolを基底型とするenumではgccが規格に反して最下位ビットを切り捨てるため、~boolean::TRUEがFALSEになる。P4313R1のビットマスク演算提案を例に、整数昇格が避けられないこと、スコープなしenumの値域外キャストが未定義動作を引き起こす危険性を解説する。

trueの補数はtrueである、C++で書けばstatic_cast<bool>(~true) == trueとなる。

この日のほかの記事

2026-10-06