使用内联静态数据成员有什么潜在的缺陷吗?
Any potential pitfall of using inline static data member?
C++17引入了inline variable,内联静态数据成员可以在class定义中定义一个初始化器。它不需要超出 class 的定义。例如,
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()
returns 也必须声明。它可能是一些过于复杂的 class
,然后作为参数传递给 and_then_more()
,最终计算 n
.
的初始值
并且 #include
声明 X
的头文件中的所有内容现在必须包含所有这些依赖项的所有头文件。
但如果没有 inline
,您所拥有的只是:
struct X {
static int n;
};
并且您只需要在实例化 X::x
的一个翻译单元中处理所有这些依赖关系。 #include
只有 X
的头文件才关心它。
换句话说:information hiding。如果需要重新实现 n
初始值的来源,您只需重新编译一个翻译单元,而不是整个源代码。
C++17引入了inline variable,内联静态数据成员可以在class定义中定义一个初始化器。它不需要超出 class 的定义。例如,
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()
returns 也必须声明。它可能是一些过于复杂的 class
,然后作为参数传递给 and_then_more()
,最终计算 n
.
并且 #include
声明 X
的头文件中的所有内容现在必须包含所有这些依赖项的所有头文件。
但如果没有 inline
,您所拥有的只是:
struct X {
static int n;
};
并且您只需要在实例化 X::x
的一个翻译单元中处理所有这些依赖关系。 #include
只有 X
的头文件才关心它。
换句话说:information hiding。如果需要重新实现 n
初始值的来源,您只需重新编译一个翻译单元,而不是整个源代码。