为什么代码没有引起编译错误?
#include<iostream>
class x{
private:
int v;
public:
x():v(7){};
};
class b{
private:
static x as;
int a;
public:
b():a(8){};
};
//x b::as;
int main(){
b g;
return 0;
}
即使在注释了特定的行
x b::as
代码后,我认为它也应该工作,因为我没有定义/初始化我的静态对象(这是必需的)。为什么会这样呢?如果我使用
static x asd; x bv=asd;
这样的静态对象启动非静态对象该怎么办? 最佳答案
该程序可以编译并正常运行,因为它实际上并未违反任何规则。这里的关键规则是在[basic.def.odr]中:
在您的程序中,b::as
尚未使用。但是,一旦在某个地方使用它(例如,获取其地址或尝试访问as.v
等),便会违反此条件,因为您未提供as
的定义。