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

为什么静态内联变量需要“内联”?

  •  19
  • oz1cz  · 技术社区  · 7 年前

    C++17允许这样定义静态成员变量:

    class X {
      public:
        static inline int i = 8;
    };
    

    要求 inline 规格为什么不简单地允许程序员编写呢

        static int i = 8;
    

    在课堂上?

    1 回复  |  直到 7 年前
        1
  •  14
  •   StoryTeller - Unslander Monica    7 年前

    没有 inline ,它仅明确表示为一个声明。如中所述 [class.static.data]/2

    类中非内联静态数据成员的声明 定义不是定义 并且可能是其他类型的不完整 类定义中的内联定义应出现在命名空间中 包含成员的类定义的范围。

    其基本原理很可能是保持遗留代码完整有效。回想一下,我们可以在类定义本身中初始化整型常量,这几乎是永远的事情了。但使用它们的odr仍然需要在某些翻译单元中进行类外定义。

    例如,考虑这个有效的C++03类定义:

    struct foo {
        static const int n = 3;
        double bar[n];
    };
    

    n 可以用作常量表达式来定义 bar ,并且它不被视为odr使用。现在我们把它写成 constexpr 然而,上述内容仍然有效。但是在那里 也许 be案例 n 必须使用odr(想象它的地址,或绑定到它的引用,等等)。它们可能不多,也可能不常见,但某些API有疯狂的需求,最终需要这样做

    const int foo::n;
    

    出现在某个翻译单元中。

    现在,如果 static inline int i = 8; 突然含蓄地 内联 ,则上述定义(即在现有代码库中)将违反odr。现在以前格式良好的代码是格式不良的。所以最好只允许 明确的 内联 在这里生效,因为实际上只有新代码才会有它。


    1. 有人可能会说 static constexpr