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 为了避免以下缺陷而谨慎行事核心问题 1397.
该问题规定,如果 NSDMI(非静态数据成员初始值设定项)导致生成类的默认默认构造函数,则程序的格式不正确。
然而你的代码并没有这样做。 NSDMI 只是一个整数文字。提示此问题的示例的代码如下int a = ( (sa(), 123) );
我猜可能发生的是:该标准还规定,在处理 NSDMI 时,该类sa
应视为完整。因此,编译器可能会将 NSDMI 处理推迟到右大括号之后sa
到达了;然后标记错误,因为inline static sb b;
会产生sb::sb()
.
可能该标准仍然有缺陷,直到现在还没有人想到你的例子。
作为解决方法,您可以显式提供麻烦的构造函数:
struct sb { int a = 123; sb() {} };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)