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

时间:2018-04-22 01:34:55

标签: c++ inline c++17 static-members inline-variable

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

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

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

1 个答案:

答案 0 :(得分:5)

不是陷阱,但这是不使用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()返回的内容。它可能是一些可怕的过于复杂的class,然后作为参数传递给and_then_more(),最终计算n的初始值。

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

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

struct X {

   static int n;
};

并且您只需要在一个实例化X::x的翻译单元中处理所有这些依赖项。 #includeX页头文件关注它的任何其他内容。

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