为什么不允许位字段作为类的静态数据成员

Din*_*rya 4 c++ bit-fields

任何人都可以解释不允许位字段作为类的静态成员的原因吗?例如,一个类定义如下:

class A{
public:
    A() {}
    ~A(){}
private:
    static int mem :10;
};
int A::mem;
Run Code Online (Sandbox Code Playgroud)

不编译.

使用不同的编译器编译此类: -

1- g ++抛出错误: -

错误:静态成员'mem'不能是位字段

static int mem :10;
Run Code Online (Sandbox Code Playgroud)

错误:'int A :: mem'不是'class A'的静态数据成员

int A :: mem;

2-铛抛出错误: -

错误:静态成员'mem'不能是位字段

static int mem :10;
Run Code Online (Sandbox Code Playgroud)

3-Visual Studio 15抛出错误: -

'A :: mem'::非法存储类

'int A :: mem':不允许成员函数重新声明

Sto*_*ica 6

主要原因是因为C++标准明确说明了这一点:

[class.bit] 12.2.4/3

位字段不应是静态成员.位字段应具有整数或枚举类型([basic.fundamental]).bool值可以成功地存储在任何非零大小的位字段中.地址运算符&不应用于位字段,因此没有指向位字段的指针.非const引用不应绑定到位字段([dcl.init.ref]).[注意:如果类型为const T&的引用的初始化程序是引用位字段的左值,则引用绑定到临时初始化以保存位字段的值; 引用不直接绑定到位字段.见[dcl.init.ref]. - 结束说明]

这个推理呢?好吧,位域是来自C的结转.它们仅允许作为结构或联合字段开始.就个人而言,我无法想到静态位字段成员可能有用的上下文.

此外,实际上关于位字段的所有内容都已经实现了定义,并且让静态数据以完全实现定义的方式运行,恕我直言是一个非常糟糕的主意.