为什么不能声明嵌套类类型的内联静态数据成员?

问题描述 投票:0回答:1
struct sa
{
  struct sb { int a = 123;};
  inline static sb b;
};

上面的代码会产生错误:

main.cpp:25:20: error: default member initializer for ‘sa::sb::a’ required before the end of its enclosing class
   inline static sb b;
                    ^
main.cpp:24:21: note: defined here
   struct sb { int a = 123;};
                     ^~~~~~

删除

inline
关键字或默认成员初始值设定项是有效的。但仅从输出来看,我不明白为什么这种用法是错误的。

c++ static c++17 static-members inline-variable
1个回答
13
投票

我认为这段代码是正确的,应该被接受; gcc 和 clang 为了避免 Core Issue 1397 的缺陷而犯了谨慎的错误。

该问题规定,如果 NSDMI(非静态数据成员初始值设定项)导致生成类的默认默认构造函数,则程序是格式错误的。

但是你的代码并没有这样做。 NSDMI 只是一个整数文字。提示此问题的示例具有类似

int a = ( (sa(), 123) );

的代码

我猜可能会发生的是:该标准还规定,在处理 NSDMI 时,类

sa
应被视为完整。因此,编译器可能会将 NSDMI 处理推迟到到达
sa
的右大括号之后;然后标记错误,因为
inline static sb b;
会生成
sb::sb()

可能该标准仍然有缺陷,直到现在还没有人想到你的例子。

作为解决方法,您可以显式提供麻烦的构造函数:

struct sb { int a = 123; sb() {} };
© www.soinside.com 2019 - 2024. All rights reserved.