代码之家  ›  专栏  ›  技术社区  ›  Lingxi

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

  •  3
  • Lingxi  · 技术社区  · 6 年前

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

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

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

    1 回复  |  直到 6 年前
        1
  •  6
  •   Sam Varshavchik    6 年前

    这不是陷阱,但这里有一个不使用 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\u out\u where\n\u comes\u from() 还必须声明退货。这可能是非常复杂的 class ,然后传递给 and\u then\u more() ,作为参数,最终计算 n

    以及一切 #include s头文件,其中 X 声明的现在必须包括所有这些依赖项的所有头文件。

    但没有 内联 ,您只有:

    struct X {
    
       static int n;
    };
    

    您只需要在一个实例化的翻译单元中处理所有这些依赖关系 X::x .没什么别的了 #包括 仅限s 十、 的头文件关心它。

    换句话说: information hiding .如果有必要重新实施,其中 N 来自,您只需要重新编译一个翻译单元,而不是整个源代码。

    推荐文章