2016-11-17 81 views

回答

21

一个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 0.6)。

11

从[dcl.constexpr]:

的函数或与该constexpr 说明符声明静态数据成员可隐式的内联函数或变量(7.1.6)。

对于类模板的静态(非constexpr)数据成员没有这样的隐式inline。然而,在C++ 17,我们现在可以标记变量本身作为inline,[dcl.inline]:

inline说明符的变量声明声明内嵌变量。