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
关键字或默认成员初始值设定项有效。但仅从输出来看,我不明白为什么这种用法是错误的。
最佳答案
我认为这段代码是正确的,应该被接受;为了避免 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() {} };
关于c++ - 内联静态成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61698030/