静态对象声明只引起错误

时间:2015-08-21 13:17:54

标签: c++ c++11 c++14

为什么代码不会导致编译错误?

 #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;这样的静态对象启动非静态对象怎么办?

2 个答案:

答案 0 :(得分:2)

程序编译并运行正常,因为它实际上并没有违反任何规则。这里的关键规则是[basic.def.odr]:

  

每个程序应包含每个非内联函数或变量的一个定义   在该计划中;无需诊断。

在您的计划中,b::as尚未使用 odr-used 。但是,只要您在某个地方使用它(可能是您使用其地址,或尝试访问as.v等),那么您违反了此条件,因为您没有为as提供定义

答案 1 :(得分:1)

  1. 在您的代码中使用它(b::as)之前,它不会导致错误。然后,链接器将无法找到它的定义并导致未解决的引用错误:

      

    对b :: as

    的未定义引用
  2. 如果您尝试使用静态类初始化非静态类成员,则此行为相同:

    1. 如果您在此定义静态成员,则无误。
    2. 如果不这样做,则会出现未解决的引用错误。

      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.