使用内联静态数据成员的任何潜在缺陷?

Lin*_*gxi 2 c++ inline static-members c++17 inline-variable

C++ 17引入了内联变量,并且可以使用初始化程序在类定义中定义内联静态数据成员.它不需要一个类外的定义.例如,

struct X {
  inline static int n = 1;
};
Run Code Online (Sandbox Code Playgroud)

鉴于此,我认为没有理由不总是使用内联静态数据成员,以获得简洁的语法.这样做的任何陷阱?请注意,我不介意慢速编译.

Sam*_*hik 5

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

struct X {
  inline static int n = and_then_more(figure_out_where_n_comes_from());
};
Run Code Online (Sandbox Code Playgroud)

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

此外,figure_out_where_n_comes_from()还必须声明任何返回.它可能是一些可怕的过于复杂的class,然后and_then_more()作为参数传递给最终计算初始值n.

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

但没有inline,你只有:

struct X {

   static int n;
};
Run Code Online (Sandbox Code Playgroud)

而且您只需要在一个实例化的翻译单元中处理所有这些依赖项X::x.没有其他#include只有X头文件关心它.

换句话说:信息隐藏.如果需要重新实现初始值的n来源,则只需重新编译一个翻译单元,而不是整个源代码.