常量表達式(const expression):是指值不會改變並且在編譯過程中就得到計算結果的表達式。(運行中得到結果的不能成為常量表達式)。
const int i=3; //是一個常量表達式
const int j=i+1; //是一個常量表達式
int k=23; //k的值可以改變,從而不是一個常量表達式
const int m=f(); //不是常量表達式,m的值只有在運行時才會獲取。
constexpr變量:
C++11允許聲明constexpr類型來由編譯器檢驗變量的值是否是一個常量表達式。聲明為constexpr的必須是一個常量,並且只能用常量或者常量表達式來初始化。
constexpr int i=3;
constexpr int j=i+1;
constexpr int k=f(); //只有f()是一個constexpr函數時k才是一個常量表達式
一般來說,若果一旦認定變量是一個常量表達式,那就把它聲明為constexpr類型
盡管指針和引用都可以定義為constexpr,但是他們的初始值卻受到了嚴格的限制。一個constexpr指針的初始值必須是nullptr或者0,或者是存儲某個固定地址的對象。函數體中定義的變量並非存放在固定地址中,因此constexpr指針不可以指向這樣的變量。相反的,對於所有函數體之外的對象地址是固定不變的,可以用constexpr來定義;
必須明確一點,在constexpr聲明中,如果定義了一個指針,限定符號constexpr僅僅對指針有效,與指針所指對象無關。
const int *p=nullptr; //p是一個指向整型常量的指針(pointer to const)
constexpr int *p1=nullptr; //p1是一個常量指針(const pointer)