我最近研究了 P4313 R1,这是一项标准提案,旨在通过 C++26 注解为枚举添加位掩码操作。其核心概念是使用 `[[=std::bitmask_type]]` 自动生成位运算符,从而消除手动实现的需要。虽然 C++ 编译器可以顺利地对整型执行位运算,但一个关键细节涉及整型提升。小于 `int` 的类型(如 `short`)在运算前会提升为 `int`。这意味着对较小类型进行运算的结果类型默认为 `int`,需要使用 `static_cast` 转换回原始类型,以避免意外行为。此外,`bool` 类型也带来独特的风险。布尔转换不会截断位模式;相反,它将任何非零值映射为 `true`(整数值 1),零映射为 `false`。结合这些规则会发现一个奇怪的现象:对 `true` 取补(`~true`)会将 `true` 提升为 `int`(值 1),计算出的二进制补码结果为 `-2`,而由于 `-2` 非零,布尔转换返回 `true`。因此,`static_cast(~true) == true`。这种行为也适用于基于 `bool` 的枚举,例如使用 `[[=std::bitmask_type]]` 定义的枚举,这突显了理解这些隐式转换对于稳健 C++ 开发的重要性。
来源: Hacker News · 由HeadlinesBriefing整理摘要