本系列文章由
@yhl_leo
關鍵字constexpr
於 c++11 中引入並於 c++14 中得到改善。它表示常數表示式。與const
相同,它可應用於變數,因此如果任何**試圖修改該值,均將引發編譯器錯誤。與const
不同,constexpr
也可應用於函式和類建構函式。constexpr
指示值或返回值是常數,並且如果可能,將在編譯時計算值或返回值。
const
和constexpr
變數之間的主要區別在於:const
變數的初始化可以延遲到執行時,而constexpr
變數必須在編譯時進行初始化。所有constexpr
變數均為常量,因此必須使用常量表示式初始化。
constexpr
float x = 42.0;
constexpr
float y;
constexpr
float z = exp(5, 3);
constexpr
int i; // error! not initialized
int j = 0;
constexpr
int k = j + 1; //error! j not a constant expression
一般來說,如果你認定變數是乙個常量表示式,那就把它宣告成為constexpr
型別。
constexpr
函式是在使用需要它的**時,可以在編譯時計算其返回值的函式。當其引數為constexpr
值並且在編譯時使用**需要返回值時(例如,初始化乙個constexpr
變數或提供乙個非型別模板引數),它會生成編譯時常量。使用非constexpr
引數呼叫時,或編譯時不需要其值時,它將與正則函式一樣,在執行時生成乙個值。
#include
using
namespace
std;
// pass by value
constexpr
float
exp(float x, int n)
;// pass by reference
constexpr
float exp2(const
float& x, const
int& n)
;// compile time computation of array length
template
constexpr
int length(const t(&ary)[n])
// recursive constexpr function
constexpr
int fac(int n)
// user-defined type
class foo
constexpr
int getvalue()
private:
int _i;
};int main()
; constexpr
int val = foo.getvalue();
constexpr
int f5 = fac(5);
const
int nums;
const
int nums2[length(nums) * 2];
cout
<< "the value of foo is "
<< foo.getvalue() << endl;
}
還記得const
與指標的規則嗎?如果關鍵字const
出現在星號左邊,表示被指物是常量;如果出現在星號右邊,表示指標本身是常量;如果出現在星號兩邊,表示被指物和指標兩者都是常量。
與const
不同,在constexpr
宣告中如果定義了乙個指標,限定符constexpr
僅對指標有效,與指標所指物件無關。
const
int *p = 0; // non-const pointer, const data
constexpr
int *q = 0; // const pointer, non-const data
與其它常量指標類似,const
指標既可以指向常量也可以指向乙個非常量:
int j = 0;
constexpr
int i = 2;
constexpr
const
int *p = &i; // const pointer, const data
constexpr
int *p1 = &j; // const pointer, non-const data
C constexpr型別說明符
常量表示式的值需要在編譯時就得到計算,因此對宣告constexpr時用到的型別必須有所限制。因為這些型別一般比較簡單,值也顯而易見 容易得到,就把它們稱為 字面值型別 literal type 算術型別 引用和指標都屬於字面值型別。某些類也是字面值型別,它們可能含有constexpr函式成員。自定義...
auto型別說明符
c 11新標準引入了auto型別說明符 用它能讓編譯器替我們分析表示式所屬的型別 auto讓編譯器通過初始值來推算出標量的型別。顯然auto定義的變數必須有初始值 auto item vall val2 item的型別通過val2和val1的相加的結果得出 使用auto也能在一條語句中宣告多個變數 ...
auto型別說明符
程式設計時,需要把表示式的值賦給變數,這就要求在宣告變數時清楚知道表示式的型別。為了解決這個問題,c 11引入auto型別說明符,用它就能讓編譯器替我們去分析表示式所屬的型別。auto讓編譯器通過初值來推算變數的型別。因此,auto定義的變數必須有初始值。auto能在一句中定義多個變數,但是這幾個變...