2016-11-17 33 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說明符的變量聲明聲明內嵌變量。