1 #include <vector> 2 #include <deque> 3 #include <algorithm> 4 #include <iostream> 5 #include <ostream> 6 #include <iterator> 7 using namespace std; 8 template <typename T> 9 class conststaticconstant 10 { 11 public://class內含const static integral data(整數型別) member,那么就可以直接賦初值 12 static const int _datai = 5; 13 static const long _datal = 3L; 14 static const char _datac = 'c'; 15 constexpr static const double _datad = 8.88;//error: 'constexpr' needed for in-class initialization of static data member 'const float conststaticconstant<T>::_dataf' of non-integral type [-fpermissive] 16 //static const float _dataf = 9.9; 17 // void operator ()(const T& elem){ 18 // cout << elem << ' '; 19 // } 20 }; 21 int main( ) 22 { 23 cout << conststaticconstant<int>::_datai << endl; 24 cout << conststaticconstant<long>::_datal << endl; 25 cout << conststaticconstant<char>::_datac << endl; 26 cout << conststaticconstant<double>::_datad << endl; 27 return 0; 28 }
const
和 constexpr
變量之間的主要區別在於:const
變量的初始化可以延遲到運行時,而 constexpr
變量必須在編譯時進行初始化。所有 constexpr
變量均為常量,因此必須使用常量表達式初始化。
constexpr
函數是在使用需要它的代碼時,可以在編譯時計算其返回值的函數。當其參數為 constexpr
值並且在編譯時使用代碼需要返回值時(例如,初始化一個 constexpr
變量或提供一個非類型模板參數),它會生成編譯時常量。使用非constexpr
參數調用時,或編譯時不需要其值時,它將與正則函數一樣,在運行時生成一個值。
與const
不同,在constexpr
聲明中如果定義了一個指針,限定符constexpr
僅對指針有效,與指針所指對象無關。
const int *p = 0; // non-const pointer, const data constexpr int *q = 0; // const pointer, non-const data