不完整类型的静态字段 - 合法吗?

时间:2011-11-09 17:18:47

标签: c++ static incomplete-type

在C ++中类定义合法时,声明一个类型的静态字段是不完整的吗?例如:

foo.h中:

class Foo
{
public:
  // ...
private:
  class Bar;
  static Bar something;
};

Foo.cpp中:

class Foo::Bar
{
  // ...
};

Foo::Bar Foo::something;

// some more code

编译器似乎接受了它,我没有看到它应该被拒绝的原因,但标准对这种情况有何看法?我非常感谢有人直接引用标准,最好来自“旧”标准(2003年的标准)。

2 个答案:

答案 0 :(得分:14)

是的,你正在做的是特别允许的(§9.4.2/ 2):“在类定义中声明静态数据成员不是定义,除了cv-qualified之外可能是不完整的类型作废“。

答案 1 :(得分:3)

我不能引用标准,但我可以给你“像编译器一样思考”的建议。

当你宣布something时,编译器需要知道什么类型?如果它是一个普通的成员,它需要知道它的大小,以便它可以将它包含在类定义中,但静态成员不是这样,因为它们的存储不是类的一部分。它不需要知道如何构造它,因为它不会被构造为类构造的一部分。在声明它时,编译器确实没有任何关于该静态类的知识,因此前向声明可以正常工作。