C 11新標準constexpr關鍵字

2021-08-02 23:45:28 字數 1024 閱讀 7785

constexpr是c++11新標準規定的規定的關鍵字。有時我們很難分辨乙個初始值是不是常量表示式,當然可以定義乙個
const變數並把它的初始值設為我們認為的某個常量表示式,但在實際使用時,儘管要求如此卻常常發現初始值並非常量 

表示式的情況。可以說,這時的物件的定義與使用根本就是兩回事。

c++11新標準規定,允許將變數宣告為constexpr型別讓編譯器來驗證變數的值是否是乙個常量表示式。 

宣告為constexpr的變數一定是乙個常量,而且必須用常量表示式初始化: 

constexpr int mf = 0; // 0 是常量表示式 

constexpr int limit = mf + 1; // mf + 1 是常量表示式 

constexpr int sz = size(); // 只有當 size() 是乙個constexpr函式時才是一條正確的宣告語句

constexpr函式要求所定義的函式足夠簡單以使得編譯時就可以計算其結果

constexpr int dec(int i)

constexpr還能修飾類的建構函式,即保證傳遞給該建構函式的所有引數都是constexpr,那麼產生的物件的所有成員都是constexpr, 

該物件也是constexpr物件了,可用於只使用constexpr的場合。 

**注意**constexpr建構函式的函式體必須為空,所有成員變數的初始化都放到初始化列表中。

class test 

private:

int v1;

int v2;

}constexpr test a(1,2)

enum e = ;

使用constexpr的好處

是一種很強的約束,更好的保證程式的正確定語義不被破壞;

編譯器可以對constexper**進行非常大的優化,例如:將用到的constexpr表示式直接替換成結果;

相比巨集來說沒有額外的開銷。

C 11新標準之五 constexpr

常量表示式必須在編譯期間計算出它的值並且 它的值不可以被改變。在c 11中,我們可以通過宣告constexpr讓編譯器確定乙個變數是不是常量表示式,宣告為constexpr的變數是const型別的變數,它必須由常量表示式來初始化。例如 cpp view plain copy constexpr in...

C 11新標準總結

c 11新標準出現已久,在此主要對它做乙個總結 c 11新增型別long long和unsigned long long,以支援64位的整型,char16 t,char32 t,以支援16位和32位的字元表示。用大括號括起來的列表 初始化列表 的適用範圍,使其可用於所有內建型別和使用者定義的型別。使...

C 11 新標準學習記錄1

1.long long 型別,c primer 第五版中 說long long 是c 11 中新定義的人。我在使用xp 32位 vs2005 時,發現也有long long 型別,並且是8位元組的,應該是編譯器提供的一型別.2,列表初始化,對於內建變數,現在可以支援四種初始化方式 int i 0 i...