C constexpr型別說明符

2021-07-10 10:53:24 字數 2616 閱讀 1077

本系列文章由

@yhl_leo

關鍵字constexpr於 c++11 中引入並於 c++14 中得到改善。它表示常數表示式。與const相同,它可應用於變數,因此如果任何**試圖修改該值,均將引發編譯器錯誤。與const不同,constexpr也可應用於函式和類建構函式。constexpr指示值或返回值是常數,並且如果可能,將在編譯時計算值或返回值。

constconstexpr變數之間的主要區別在於: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能在一句中定義多個變數,但是這幾個變...