为什么代码不会导致编译错误?
#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;
这样的静态对象启动非静态对象怎么办?
答案 0 :(得分:2)
程序编译并运行正常,因为它实际上并没有违反任何规则。这里的关键规则是[basic.def.odr]:
每个程序应包含每个非内联函数或变量的一个定义
在该计划中;无需诊断。
在您的计划中,b::as
尚未使用 odr-used 。但是,只要您在某个地方使用它(可能是您使用其地址,或尝试访问as.v
等),那么您违反了此条件,因为您没有为as
提供定义
答案 1 :(得分:1)
在您的代码中使用它(b::as
)之前,它不会导致错误。然后,链接器将无法找到它的定义并导致未解决的引用错误:
对b :: as
的未定义引用
如果您尝试使用静态类初始化非静态类成员,则此行为相同:
如果不这样做,则会出现未解决的引用错误。
class b {
private:
static x as;
int a = b::as;
public:
b():a(8){};
};
x b::as; // this is now correct but if you comment this, you should can't initialize `b::a` with `b::as` then because it will cause a unresolved reference error.