3 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
介紹
constexpr
沒(méi)有引入作為告訴實(shí)現(xiàn)的方法,可以在需要常量表達(dá)的上下文中評(píng)估某些內(nèi)容; 符合實(shí)現(xiàn)已經(jīng)能夠在C ++ 11之前證明這一點(diǎn)。
實(shí)現(xiàn)無(wú)法證明的是某段代碼的意圖:
開發(fā)人員想用這個(gè)實(shí)體表達(dá)什么?
我們應(yīng)該盲目地允許代碼在常量表達(dá)式中使用,只是因?yàn)樗『闷鹱饔昧藛幔?/p>
沒(méi)有世界會(huì)是constexpr
什么?
假設(shè)您正在開發(fā)一個(gè)庫(kù)并意識(shí)到您希望能夠計(jì)算該區(qū)間中每個(gè)整數(shù)的總和(0,N]
。
int f (int n) { return n > 0 ? n + f (n-1) : n;}
缺乏意圖
如果傳遞的參數(shù)在轉(zhuǎn)換期間是已知的,編譯器可以很容易地證明上述函數(shù)在常量表達(dá)式中是可調(diào)用的。但你沒(méi)有宣稱這是一個(gè)意圖 - 事實(shí)恰恰相反。
現(xiàn)在別人出現(xiàn),讀取你的函數(shù),做與編譯器相同的分析; “ 哦,這個(gè)函數(shù)可用于常量表達(dá)!” ,并編寫以下代碼。
T arr[f(10)]; // freakin' magic
優(yōu)化
作為一個(gè)“令人敬畏”的庫(kù)開發(fā)人員,您決定f
在調(diào)用時(shí)應(yīng)該緩存結(jié)果; 誰(shuí)想要一遍又一遍地計(jì)算同一組價(jià)值?
int func (int n) { static std::map<int, int> _cached; if (_cached.find (n) == _cached.end ()) _cached[n] = n > 0 ? n + func (n-1) : n; return _cached[n];}
結(jié)果
通過(guò)引入您的愚蠢優(yōu)化,您只是打破了函數(shù)的每個(gè)用法,這些用法恰好位于需要常量表達(dá)式的上下文中。
你從來(lái)沒(méi)有承諾該函數(shù)的是使用常數(shù)表達(dá)式,沒(méi)有constexpr
就沒(méi)有提供這樣的承諾的方式。
那么,我們?yōu)槭裁葱枰?code>constexpr呢?
constexpr的主要用途是聲明意圖。
如果實(shí)體未標(biāo)記為constexpr
- 它從未打算用于常量表達(dá)式 ; 即使它是,我們依靠編譯器來(lái)診斷這樣的上下文(因?yàn)樗雎粤宋覀兊囊鈭D)。

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊
拿std::numeric_limits<T>::max()
:無(wú)論出于何種原因,這是一種方法。constexpr
這將是有益的。
另一個(gè)例子:你想聲明一個(gè)std::array
與另一個(gè)數(shù)組一樣大的C數(shù)組(或a )。目前這樣做的方法是這樣的:
int x[10];int y[sizeof x / sizeof x[0]];
但是能寫的不是更好:
int y[size_of(x)];
謝謝你constexpr
,你可以:
template <typename T, size_t N>constexpr size_t size_of(T (&)[N]) { return N;}
- 3 回答
- 0 關(guān)注
- 1142 瀏覽
添加回答
舉報(bào)