使用内联静态数据成员有什么潜在的缺陷吗?

Any potential pitfall of using inline static data member?

C++17引入了inline variable,内联静态数据成员可以在class定义中定义一个初始化器。它不需要超出 class 的定义。例如,

struct X {
  inline static int n = 1;
};

鉴于此,我认为没有理由不始终使用 内联静态数据成员,以获得简洁的语法。这样做有什么陷阱吗?请注意,我不介意编译速度变慢。

这不是陷阱,但这里有一个不使用 inline 的原因:如果变量的初始值不仅仅是一个普通常量,而是更复杂的东西:

struct X {
  inline static int n = and_then_more(figure_out_where_n_comes_from());
};

现在,figure_out_where_n_comes_from()and_then_more()的声明必须拉入头文件,现在。

此外,无论什么 figure_out_where_n_comes_from() returns 也必须声明。它可能是一些过于复杂的 class,然后作为参数传递给 and_then_more(),最终计算 n.

的初始值

并且 #include 声明 X 的头文件中的所有内容现在必须包含所有这些依赖项的所有头文件。

但如果没有 inline,您所拥有的只是:

struct X {

   static int n;
};

并且您只需要在实例化 X::x 的一个翻译单元中处理所有这些依赖关系。 #include 只有 X 的头文件才关心它。

换句话说:information hiding。如果需要重新实现 n 初始值的来源,您只需重新编译一个翻译单元,而不是整个源代码。