【问题标题】:Static field of an incomplete type - is it legal?不完整类型的静态字段 - 合法吗?
【发布时间】:2011-12-25 12:22:06
【问题描述】:

在 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 年的标准)。

【问题讨论】:

    标签: c++ static incomplete-type


    【解决方案1】:

    是的,您正在做的事情是明确允许的(第 9.4.2/2 节):“在其类定义中声明静态数据成员不是定义,并且可能是 cv 限定以外的不完整类型无效。”

    【讨论】:

      【解决方案2】:

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

      在您声明something 时,编译器需要了解该类型的哪些信息?如果它是普通成员,则需要知道大小,以便将其包含在类定义中,但对于静态成员而言并非如此,因为它们的存储不是类的一部分。它不需要知道如何构造它,因为它不会作为类构造的一部分来构造。在声明静态类时,编译器实际上不需要知道任何关于该静态类的信息,因此前向声明就可以正常工作。

      【讨论】:

      • 是的。这就是为什么我说“我没有看到应该拒绝它的理由”。我知道你写的东西,我只是不确定标准是否出于某种原因不允许这样的代码(它是 C++,你永远无法确定),这就是我想要直接引用的原因。此外,我不得不在这里问我的第一个问题;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多