天天看點

C++中const與constexpr的關系1 使用const定義常量表達式2 使用constexpr定義常量表達式3 const int*和constexpr int*

在C++中,可以用const或者constexpr來表示常量表達式。常量表達式是值不會改變并且在編譯過程中就能得到計算結果的表達式。

1 使用const定義常量表達式

const int i = 42;

const int j = i + 1;
           

其中,i和j都可以看做是常量表達式。

const int Test()

{

   return 1;

}

const int k = Test();
           

其中,k不是常量表達式,因為k的值隻能在程式運作時才能得到。

2 使用constexpr定義常量表達式

使用constexpr定義常量表達式是C++11新标準中規定的。正如“1 使用const定義常量表達式”中提到,k的定義在編譯時是不報錯的,但是k卻不是常量表達式,是以編譯器很難判斷一個初始值是否是常量表達式。可以使用constexpr來定義類型,這樣編譯器就可以判斷定義的變量是否是常量表達式了。

constexpr int i = 1;

constexpr int j = i + 1;
           

因為i和j都是常量表達式,此時程式編譯時不會報錯。而

const int Test()

{

   return 1;

}

constexpr int k = Test();
           

此時,需要變量k是常量表達式,但是函數Test()傳回的不是常量表達式,是以程式在編譯時會報錯。

3 const int*和constexpr int*

const int* p = nullptr;

constexpr int* q = nullptr;
           

其中,p表示指向整型常量的指針,而p的本身是可以修改的;q表示指向整型的指針,q的本身是常量表達式,是不能修改的。

對這兩種類型的指針進行指派時

const int i = 2;

const int* p = nullptr;

p = &i;



int j = 3;

constexpr int* q = &j;
           

而如果對q進行如下初始化

constexpr int k = 1;

constexpr int* q = &k;
           

或者

constexpr int* q = &i;
           

都會報錯。