为何uint16_t按位或结果非uint16_t?静态断言失败解析
为何这个静态断言会失败?
先看这段触发问题的代码:
static_assert(std::is_same<uint16_t, decltype(uint16_t(0)|uint16_t(0))>::value);
你提到cppreference中按位逻辑运算符的规则:
对两个操作数执行常规算术转换,并确定结果的类型。
问题的核心是常规算术转换包含「整数提升」步骤,并非直接保留原操作数类型。
具体逻辑如下:
- 多数平台上
uint16_t等价于unsigned short。 - 根据整数提升规则:如果
int类型能容纳unsigned short的所有取值范围(通常int是32位,完全覆盖16位无符号整数的0~65535),那么unsigned short会被自动提升为int。 - 两个被提升为
int的操作数执行按位或后,结果类型是int,而非uint16_t,这直接导致静态断言失败。
如果要让结果类型保持uint16_t,可以手动对结果做强制转换:
static_assert(std::is_same<uint16_t, decltype(static_cast<uint16_t>(uint16_t(0)|uint16_t(0)))>::value);
内容的提问来源于stack exchange,提问作者John Gordon
相关产品推荐
相关产品推荐

