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...