为什么std::is_integral将bool认定为整型,为何无单独std::is_boolean类型萃取?
问题解答
为什么std::is_integral<bool>::value返回true
这一设计完全符合C++标准对「整型(integral type)」的基础定义,并非类型萃取的特殊归类:
- C++标准明确定义了基础类型的分类,布尔类型bool本身就属于整型集合的一员,和char、int、long等类型同属整型分类下的不同子类型
std::is_integral的设计目标就是判断类型是否属于标准定义的整型范畴,所以对bool返回true是完全符合接口设计预期的行为
为什么C++标准没有单独提供std::is_boolean类型萃取
核心原因是没有必要:
- bool是唯一的布尔类型,没有其他变种,判断一个类型是不是bool,直接使用现有工具
std::is_same<T, bool>::value(C++17及以上可写为std::is_same_v<T, bool>)就可以完全实现需求,不需要额外封装新的类型萃取 - 标准新增类型萃取的原则是对应判断逻辑需要覆盖多类场景、或者实现逻辑复杂,单独封装可以减少开发者重复代码,而bool的判断逻辑过于简单,不符合新增萃取的投入产出比
如果你的业务场景需要区分「非bool的整型」,可以直接组合现有萃取实现:
template<typename T> constexpr bool is_non_bool_integral = std::is_integral_v<T> && !std::is_same_v<T, bool>;
你给出的测试代码正好验证了这两点:std::is_same可以正确区分bool和其他整型的差异,而std::is_integral对bool返回true符合标准定义。
内容的提问来源于stack exchange,提问作者Ratnesh Tiwari
相关产品推荐
相关产品推荐

