C ++ 17引入了inline variable,并且可以使用初始化程序在类定义中定义内联静态数据成员。它不需要一个类外的定义。例如,
struct X {
inline static int n = 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
的翻译单元中处理所有这些依赖项。 #include
仅X
页头文件关注它的任何其他内容。
换句话说:information hiding。如果需要重新实现n
的初始值来自的位置,则只需重新编译一个翻译单元,而不是整个源代码。