为什么在静态数据成员初始化器中未完全定义类



在C 标准中,可以指定在类成员规格(类正文)中,可以将类视为完全定义的,但不适用于静态数据成员初始化器[class.mem]:

一类被视为完全定义的对象类型(6.9)(或完成类型) class-nexifier 。在类成员规范化中,该类被视为函数中的完整 身体,默认参数, noexcept-specifiers 和默认成员初始化器(包括此类内容 嵌套类)。否则,它被认为是其自己的类成员规格中的不完整

编辑:这是N4687的引用,措辞发生了变化,但我不认为含义改变了。

我期望这样的代码编译:

struct enum_like
{
  static constexpr enum_like enum_member{};
};

为什么C 标准不允许这样的定义?


我相信编译器可以这样进行:

  1. 读取成员声明,而不是定义,直到班级定义结束。(现在编译器具有完全定义的类)

  2. 分析静态数据成员初始化器(这样的编译器具有constexpr成员的恒定定义)

  3. 分析其他成员定义。

,然后解决非静态成员的[decl.init]中指定的静态成员Intializer的递归!

此规则禁止有问题的事情:

struct A {
    static constexpr std::size_t N = sizeof(A);
    char buffer[N+2];
};

最新更新