任何人都可以解释不允许位字段作为类的静态成员的原因吗?例如,一个类定义如下:
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':不允许成员函数重新声明
主要原因是因为C++标准明确说明了这一点:
位字段不应是静态成员.位字段应具有整数或枚举类型([basic.fundamental]).bool值可以成功地存储在任何非零大小的位字段中.地址运算符&不应用于位字段,因此没有指向位字段的指针.非const引用不应绑定到位字段([dcl.init.ref]).[注意:如果类型为const T&的引用的初始化程序是引用位字段的左值,则引用绑定到临时初始化以保存位字段的值; 引用不直接绑定到位字段.见[dcl.init.ref]. - 结束说明]
这个推理呢?好吧,位域是来自C的结转.它们仅允许作为结构或联合字段开始.就个人而言,我无法想到静态位字段成员可能有用的上下文.
此外,实际上关于位字段的所有内容都已经实现了定义,并且让静态数据以完全实现定义的方式运行,恕我直言是一个非常糟糕的主意.