小于int的位字段是否应该是整体提升的主题?

Pre*_*nik 8 c++ integer-promotion language-lawyer bit-fields visual-studio-2015

假设我有以下内容struct:

struct A
{
    unsigned int a : 1;
    unsigned int b : 1;
};
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是表达的类型a + b.虽然技术上比特字段的"类型"大小小于int整数提升可能应该发生,然后结果int就像它碰巧在gcc和clang中.

但是,由于不可能提取出精确类型的位域本身,并且它总是被推断为它的"大"类型(即unsigned int在这种情况下)是否正确,整体推广应该发生?因为我们实际上无法谈论比特字段的确切类型和大小,除非它们被推断为unsigned int在哪种情况下不应该进行整体提升.

(我的问题再一次源于MSVC碰巧认为unsigned int这种表达的类型)

Sha*_*our 6

如果我们去C++标准草案:N4140部分5它说:

许多期望算术或枚举类型的操作数的二元运算符会以类似的方式引起转换并产生结果类型.目的是产生一个通用类型,它也是结果的类型.该模式称为通常的算术转换,其定义如下

以下子弹适用:

  • 否则,应对两个操作数执行整数提升(4.5).61然后,以下规则应适用于提升的操作数:

和第4.5节(强调我的):

如果int可以表示位字段的所有值,则可以将整数位字段(9.6)的prvalue转换为int类型的prvalue ; 否则,如果unsigned int可以表示位字段的所有值,则可以将其转换为unsigned int.如果位字段较大,则不适用整数提升.如果位字段具有枚举类型,则将其视为该类型的任何其他值以用于促销目的.

所以gcc和铛是正确的,ab应提升为int.