为什么代码没有引起编译错误?

 #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的定义。

07-26 02:12