c++ - 内联静态成员变量

标签 c++ static inline c++17

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/

相关文章:

c++ - 使用 std::forward 的主要目的是什么以及它解决了哪些问题?

c++ - 如何以 int 形式访问 BGL 的 vertex_descriptor

c# - 重构具有内部静态属性的结构

java静态绑定(bind)和多态性

c++ - XCode4 中的 "inline Methods Hidden"选项。

c++ - 使用 makefile (c++) 部分编译和包含 boost

C++ 全局对象

c# - 覆盖静态字段

c++ - 无法使用内联功能的时间

c# - C# 不支持手动内联方法有什么原因吗?那么可选参数呢?