constexpr用于在C++11中申報(bào)常量表達(dá)式(constexpression),可用于函數(shù)返回值、函數(shù)參數(shù)、數(shù)據(jù)申報(bào)和類結(jié)構(gòu)函數(shù)。
常量表達(dá)式指數(shù)不會改變,在編譯期間得到計(jì)算結(jié)果,例如:
1)常量表達(dá)函數(shù)。
若能在編譯過程中確定函數(shù)返回值,則可使用constexpr修改函數(shù)返回值,使函數(shù)成為常量表達(dá)式函數(shù)。
請注意,constexpr修改函數(shù)的返回值需要滿足以下條件:
(a)函數(shù)必須有返回值;
(b)函數(shù)體只有單一的return語句;
(c)return語句中的表達(dá)式也必須是常量表達(dá)式;
使用前必須對函數(shù)進(jìn)行定義。
2)常量表達(dá)式值。
一般而言,如果確定變量為常量表達(dá)式,則聲明為constexpr類型。
必須明確的是,在constexpr聲明中,如果定義了指針,constexpr只對指針有效,與指針?biāo)傅膶ο鬅o關(guān)。
若自定義類型對象為常量表達(dá)式,則在定義自定義類型時,需要將constexpr作用于自定義類型的構(gòu)造函數(shù)。
作用于自定義類型的constexpr結(jié)構(gòu)函數(shù)需要滿足以下條件:
(a)構(gòu)造函數(shù)體必須為空;
(b)初始化列表只能使用常量表達(dá)式。
3)其他常量表達(dá)式應(yīng)用。
(a)常量表達(dá)式作用于函數(shù)模板。
常量表達(dá)式可以作用于函數(shù)模板,但由于函數(shù)模板參數(shù)的不確定性,實(shí)例化模板函數(shù)可能不符合常量表達(dá)式的條件。此時,C++11標(biāo)準(zhǔn)自動忽略constexpr。
(b)constexpr元編程。
constexpr可以作用于遞歸函數(shù),實(shí)現(xiàn)編譯時期的數(shù)值計(jì)算,即constexpr元編程。根據(jù)C++11標(biāo)準(zhǔn),常量表達(dá)式應(yīng)至少支持512層遞歸。
請注意,constexpr元編程并非C++11標(biāo)準(zhǔn)強(qiáng)制編譯器必須實(shí)現(xiàn),編譯器可以有選擇地實(shí)現(xiàn)。換句話說,編譯器可能不支持遞歸常量表達(dá)式函數(shù)。但也不用太擔(dān)心,主流C++編譯器都是支持的,比如GCC和VC++。
const可以修改函數(shù)參數(shù)。函數(shù)返回值。函數(shù)本身。類const在不同的使用場景中有不同的含義,但在大多數(shù)情況下,const描述的是運(yùn)行時常量性,即數(shù)據(jù)在運(yùn)行過程中是不可改變的。
constexpr可以修改函數(shù)參數(shù)、函數(shù)返回值、變量、類結(jié)構(gòu)函數(shù)、函數(shù)模板等。,這是一種比const更嚴(yán)格的約束。它修改的表達(dá)式不僅具有運(yùn)行時常量,還具有編譯時常量,即constexpr修改的表達(dá)式值可以在編譯過程中知道。我們來看看實(shí)際應(yīng)用的區(qū)別:
在constexpr出現(xiàn)之前,可以在編譯期初始化的const表達(dá)式是隱含的常量表達(dá)式(implicitconstexpr),直到c++11、constexpr才從const中細(xì)分為關(guān)鍵詞。
const自1983年C++剛改名以來就存在。面對constexpr,我們應(yīng)該盡可能合理地使用constexpr來幫助編譯器優(yōu)化代碼。