constexpr與常量表達式(c++11標準)
阿新 • • 發佈:2019-01-20
變化 必須 而是 eva 放心 定性 字符串常量 摘錄 -s
關鍵字 constexpr 是C++11中引入的關鍵字,是指值不會改變並且在編譯過程中就得到計算結果的表達式。(運行中得到結果的不能成為常量表達式,比如變量)。
聲明為constexpr的變量一定是一個常量,而且必須用常量表達式初始化:
constexpr int i=3; constexpr int j=i+1; constexpr int k=f(); //只有f()是一個constexpr函數時k才是一個常量表達式
一般來說,若果一旦認定變量是一個常量表達式,那就把它聲明為constexpr類型
常量表達式機制是為了:
1、提供了更多的通用的值不發生變化的表達式 2、允許用戶自定義的類型成為常量表達式 3、提供了一種保證在編譯期完成初始化的方法(可以在編譯時期執行某些函數調用)
語義上:
constexpr:告訴編譯器我可以是編譯期間可知的,盡情的優化我吧。
const:告訴程序員沒人動得了我,放心的把我傳出去;或者放心的把變量交給我,我啥也不動就瞅瞅。
語法上:
constexpr是一種比const 更嚴格的束縛, 它修飾的表達式本身在編譯期間可知, 並且編譯器會盡可能的
evaluate at compile time. 在constexpr 出現之前, 可以在編譯期初始化的const都是implicit
constexpr. 直到c++ 11, constexpr才從const中細分出來成為一個關鍵字, 而 const從1983年 c++
剛改名的時候就存在了
csdn論壇上看見大神的一段短話,摘錄下來,很值的體會
constexpr:不光是可以取代模板是某些常量的表達更簡潔,其實一個決定性的作用是支持地址類常量。這恰好補上了模板缺失的部分。比如有一個字符串常量"abc",很自然的可以認為其中的元素也是常量地址,對一個有編譯期內容的常量地址取值理論上可以在編譯器確定結果,但實際上按舊語法卻不能直接拿去做為常量使用而是當作變量。
constexpr與常量表達式(c++11標準)