私は最近、P4313 R1 を調柲しました。これは、C++26 アノテーションを用いて enum にビットマスク操作を追加する標準提案です。核心概念は `[[=std::bitmask_type]]` を使用してビット演算子を自動生成し、手動実装を排除することです。C++ コンパイラは整数型でのビット演算を happily 計算しますが、 critical detail は整数プロモーションにあります。`int` より小さい型(`short` など)は、操作が発生する前に `int` にプロモーションします。这意味着、小さい型での操作の結果型はデフォルトで `int` となり、予期しない挙動を避けるためには元の型に `static_cast` でキャストする必要があります。さらに、`bool` は独特のリスクを提示します。ブール変換はビットパターンを切り詰めません。代わりに、任意の非ゼロ値を `true`(整数値 1)に、ゼロを `false` にマップします。これらのルールを組み合わせると、奇妙な現象が明らかになります。`true` の補集合(`~true`)は `true` を `int`(値 1)にプロモーションし、2の補数結果を `-2` として計算し、`-2` が非ゼロであるため、ブール変換は `true` を返します。したがって、`static_cast(~true) == true` です。この挙動は `bool` 基底の enum、すなわち `[[=std::bitmask_type]]` で定義されたものにも拡張され、堅牢な C++ 開発のためにこれらの暗黙的変換を理解することが重要であることを強調しています。
出典: Hacker News · 要約:HeadlinesBriefing