C++17 引入了内联变量,并且可以在类定义中使用初始化器定义内联静态数据成员。它不需要类外定义。例如,
struct X {
inline static int n = 1;
};
鉴于此,我认为没有理由不总是使用内联静态数据成员来获得简洁的语法。这样做有什么陷阱吗?请注意,我不介意编译速度较慢。
C++17 引入了内联变量,并且可以在类定义中使用初始化器定义内联静态数据成员。它不需要类外定义。例如,
struct X {
inline static int n = 1;
};
鉴于此,我认为没有理由不总是使用内联静态数据成员来获得简洁的语法。这样做有什么陷阱吗?请注意,我不介意编译速度较慢。
这不是一个陷阱,但这是不使用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
。没有其他东西#include
只X
关心它的头文件。
换句话说:信息隐藏。如果需要重新实现初始值的n
来源,您只需重新编译一个翻译单元,而不是整个源代码。