默认情况下,C++ 17中的模板是否内联静态变量?

Gui*_*cot 22 c++ templates inline c++17

默认情况下,C++ 17中的模板是否内联静态变量?这是一个例子:

template<typename T>
struct SomeClass {
    static T test;
};

struct SomeClass2 {
    static constexpr int test = 9;
};
Run Code Online (Sandbox Code Playgroud)

这些变量是内联的还是仍然需要使用ODR来定义ODR?

Mar*_* A. 22

A static constexpr隐含也是inline,否则你需要将其标记为inline

template<typename T>
struct SomeClass {
    inline static T test; // Now inline
};

struct SomeClass2 {
    static constexpr int test = 9; // inline
};
Run Code Online (Sandbox Code Playgroud)

(CFR).来自n4606[depr.static_constexpr]

为了与先前的C++国际标准兼容,可以在类外部冗余地重新声明constexpr静态数据成员而不使用初始化程序.不推荐使用此用法.

例:

struct A {
  static constexpr int n = 5; // definition (declaration in C++ 2014)
};
const int A::n; // redundant declaration (definition in C++ 2014)
Run Code Online (Sandbox Code Playgroud)

[dcl.constexpr](巴里打我给它)

使用constexpr说明符声明的函数或静态数据成员隐式地是内联函数或变量(7.1.6).


Bar*_*rry 12

来自[dcl.constexpr]:

使用说明constexpr 符声明的函数或静态数据成员隐式地是内联函数或变量(7.1.6).

类模板的inline静态(非constexpr)数据成员没有这种隐含.但是,在C++ 17中,我们现在可以将变量标记为inline[dcl.inline]:

带有inline说明符的变量声明声明了一个内联变量.