真(true)的按位取反仍是真,除非它不是
来源:dryperspective.github.io — 2026-10-01
📋 概述
Matthew Taylor 借 C++ 位掩码枚举提案 P4313R1 切入 C++ 整数运算的暗面。由于整型提升不可避免,对 bool 取按位反 ~true 会先提升为 int(1)、取反得 -2、再转回 bool,因非零而仍为 true;标准要求如此,而 gcc 存在长期不符合标准的缺陷,对底层为 bool 的枚举会错误地按最低位截断,甚至给出既不等于 true 也不等于 false 的 bool。作者还指出无固定底层类型的枚举存在未定义行为陷阱,并提出用 concept 约束来规避。
🔑 核心要点
- 整型提升不可选,小于 int 的类型做位运算时总会先被提升为 int
- static_cast<bool>(~true) 结果为 true,因为 -2 非零
- 对底层为 bool 的枚举取反,gcc 会错误地按最低位截断,与标准不符
- 无固定底层类型的枚举取值范围可能小于底层类型,回转发会产生 UB
- 作者建议用 concept 约束排除 bool 与无固定底层枚举,并就此联系提案作者
💡 金句
结论或许就是:连 P4313 这样看似合理的纯库提案,也要提防某个古怪的 C++ 边角案例埋下的暗雷。
👍 0
👎 0
← 返回 Lobsters 首页