【问题标题】:Any potential pitfall of using inline static data member?使用内联静态数据成员有什么潜在的陷阱吗?
【发布时间】:2018-04-22 01:34:55
【问题描述】:

C++17 引入了inline variable,并且可以在类定义中使用初始化器定义内联静态数据成员。它不需要类外定义。例如,

struct X {
  inline static int n = 1;
};

鉴于此,我认为没有理由不始终使用内联静态数据成员,因为它的语法简洁。这样做有什么陷阱吗?请注意,我不介意编译速度较慢。

【问题讨论】:

  • 如果您的代码需要 C++17(或更高版本),那么我会使用它。
  • @JiveDadson 只有constexpr 静态数据成员是隐式内联的。
  • 我建议阅读这些关键字在应用于变量时的含义。

标签: c++ inline c++17 static-members inline-variable


【解决方案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 的初始值。

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

但如果没有inline,你只有:

struct X {

   static int n;
};

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

换句话说:information hiding。如果需要重新实现n 的初始值来自哪里,您只需重新编译一个翻译单元,而不是整个源代码。

【讨论】:

  • 注意替代方案:static inline int n = make_n(); -- 导出 make_n 而不是类的静态成员变量。这只是把罐子踢到路上(你仍然需要在一个地方定义一些东西,只是现在它是一个函数而不是一个变量)
猜你喜欢
  • 2014-01-18
  • 2019-02-20
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多