内联静态成员变量

时间:2018-08-22 02:32:50

标签: c++ static inline c++17

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关键字或默认成员初始化程序即可。但是从输出来看,我不明白为什么这种用法是错误的。

1 个答案:

答案 0 :(得分:7)

我认为此代码是正确的,应该接受;为了避免Core Issue 1397的缺陷,gcc和clang犯了警告。

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

但是您的代码无法执行此操作。 NSDMI只是一个整数文字。提示此问题的示例的代码类似int a = ( (sa(), 123) );

我猜可能正在发生:该标准还说,在处理NSDMI时,应该将类sa视为完整类。因此,也许编译器会将NSDMI处理推迟到sa的右括号之后;然后标记错误,因为inline static sb b;会生成sb::sb()

可能该标准仍然存在缺陷,到目前为止,没有人想到您的示例。

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

struct sb { int a = 123; sb() {} };