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

时间:2016-11-17 15:19:44

标签: c++ templates inline c++17

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

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

struct SomeClass2 {
    static constexpr int test = 9;
};

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

2 个答案:

答案 0 :(得分:22)

static constexpr隐式也是inline,否则您需要将其标记为inline

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

struct SomeClass2 {
    static constexpr int test = 9; // inline
};

(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)

[dcl.constexpr](巴里打败了我)

  

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

答案 1 :(得分:12)

来自[dcl.constexpr]:

  

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

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

  

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