假设我已关注struct
:
struct A
{
unsigned int a : 1;
unsigned int b : 1;
};
我感兴趣的是表达式a + b
的类型。虽然技术上位字段的“类型”大小小于int
,因此可能会发生整数提升,然后结果为int
,就好像它恰好位于gcc和clang中。
但是因为不可能提取精确类型的位字段本身并且它总是被推断为它的“大”类型(在这种情况下是unsigned int
),是否应该进行整体推广?因为我们实际上无法讨论比特字段的确切类型和大小,除非它们被推断为unsigned int
,在这种情况下不应该进行整体提升。
(我的问题再一次源于MSVC碰巧认为unsigned int
是这种表达的类型的事实)
答案 0 :(得分:6)
如果我们转到draft C++ standard: N4140部分5
,则会说:
许多期望算术或算术操作数的二元运算符 枚举类型导致转换并产生类似的结果类型 办法。目的是产生一种普通类型,它也是一种类型 结果。这种模式称为通常的算术转换, 其定义如下
以下子弹适用:
- 否则,应对两个操作数执行整体促销(4.5).61然后,以下规则应适用于推广 操作数:
和4.5节(强调我的):
积分位域(9.6)的prvalue可以转换为a 如果int可以表示的所有值,则类型为int的prvalue bit-field; 否则,如果是unsigned,它可以转换为unsigned int int可以表示位字段的所有值。如果位字段是 更大的,没有完整的促销适用于它。如果位域有 枚举类型,它被视为该类型的任何其他值 促销目的。
因此gcc和clang是正确的,a
和b
应该提升为int。