#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>
#include <iterator>
using namespace std;
template <typename T>
class conststaticconstant
{
public://class内含const static integral data(整数型别) member,那么就可以直接赋初值
static const int _datai = ;
static const long _datal = 3L;
static const char _datac = 'c';
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]
//static const float _dataf = 9.9;
// void operator ()(const T& elem){
// cout << elem << ' ';
// }
};
int main( )
{
cout << conststaticconstant<int>::_datai << endl;
cout << conststaticconstant<long>::_datal << endl;
cout << conststaticconstant<char>::_datac << endl;
cout << conststaticconstant<double>::_datad << endl;
return ;
}
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