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
关键字或默认成员初始值设定项是有效的。但仅从输出来看,我不明白为什么这种用法是错误的。
我认为这段代码是正确的,应该被接受; 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() {} };