oli*_*ist 8 c++ static inline c++17
struct sa
{
struct sb { int a = 123;};
inline static sb b;
};
Run Code Online (Sandbox Code Playgroud)
上面的代码生成错误:
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;};
^~~~~~
Run Code Online (Sandbox Code Playgroud)
删除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() {} };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |