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