使用内联静态数据成员有什么潜在的陷阱吗?

Any potential pitfall of using inline static data member?

本文关键字:陷阱 什么 静态 数据成员      更新时间:2023-10-16

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());
};

现在,必须将figure_out_where_n_comes_from()and_then_more()的声明拉入头文件中。

此外,无论figure_out_where_n_comes_from()回报,都必须申报。它可能是一些非常复杂的class,然后作为参数传递给and_then_more(),以最终计算n的初始值。

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

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

struct X {
static int n;
};

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

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