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)
鉴于此,我认为没有理由不总是使用内联静态数据成员,以获得简洁的语法.这样做的任何陷阱?请注意,我不介意慢速编译.
这不是一个陷阱,但这里有一个原因是不使用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来源,则只需重新编译一个翻译单元,而不是整个源代码.