【问题标题】:The Standard seems to support (the snippet below compiles) a static data member having the same type as the class itself [duplicate]该标准似乎支持(下面的代码片段编译)与类本身具有相同类型的静态数据成员[重复]
【发布时间】:2024-04-19 17:45:01
【问题描述】:

标准中具体涵盖了哪些内容?我找到了§9.2/10:Non-static (9.4) data members shall not have incomplete types. In particular, a class C shall not contain a non-static member of class C, but it can contain a pointer or reference to an object of class C.,但这似乎并不直接支持手头的问题。

#include <iostream>
struct A{
    int i;
    static A a;
};

A A::a{10};

int main() {
    std::cout << A::a.i << '\n';
}

【问题讨论】:

  • 我认为这是因为当你 declare a 它有一个不完整的类型,但由于它是一个静态变量,编译器不需要知道它的大小,直到它 定义,当A类型定义明确且完整时发生。
  • 我特别喜欢struct A { static A a; } A::a; :)

标签: c++ c++11 static-members language-lawyer


【解决方案1】:

C++11 9.4.2/2:

静态数据成员在其类定义中的声明不是定义,并且可能是除 cv 限定 void 之外的不完整类型。

【讨论】:

  • 你能补充一点解释这到底是什么意思吗?不确定我是否完全理解。
  • @AJMansfield OP 询问在标准的不完整类型中允许作为static 数据成员的位置。 MikeSeymour 发现引用说static 数据成员在声明时可以具有(非无效)不完整类型。你还有什么特别不明白的地方吗?
  • 他引用了the神圣的标准,无需解释。
  • @AJMansfield:想必你明白“类定义中静态数据成员的声明”;这就是示例中的static A a; 声明。它只是一个声明,而不是定义——在类定义之外需要有一个单独的定义(示例中为A A::a{10};)。作为声明,类型不必是完整的 - 它可以是已声明但未完全定义的类类型,就像 A 那样。 (最后一点只是说它不能有类型void - 在这里不相关)。