3

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

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

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

4

1 回答 1

6

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

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

现在,必须将 and 的声明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;
};

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

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

于 2018-04-22T01:46:07.843 回答