第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

什么時(shí)候應(yīng)該在C ++ 11中使用constexpr功能?

什么時(shí)候應(yīng)該在C ++ 11中使用constexpr功能?

C++
慕尼黑8549860 2019-08-14 17:11:08
什么時(shí)候應(yīng)該在C ++ 11中使用constexpr功能?在我看來(lái),擁有“總是返回5的功能”正在破壞或淡化“調(diào)用函數(shù)”的含義。必須有一個(gè)原因,或者需要這種能力,或者它不會(huì)出現(xiàn)在C ++ 11中。為什么會(huì)這樣?// preprocessor.#define MEANING_OF_LIFE 42// constants:const int MeaningOfLife = 42;// constexpr-function:constexpr int MeaningOfLife () { return 42; }在我看來(lái),如果我編寫了一個(gè)返回字面值的函數(shù),并且我進(jìn)行了代碼審查,有人會(huì)告訴我,我應(yīng)該聲明一個(gè)常量值而不是寫回返5。
查看完整描述

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)。


查看完整回答
反對(duì) 回復(fù) 2019-08-14
?
白衣非少年

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;}


查看完整回答
反對(duì) 回復(fù) 2019-08-14
  • 3 回答
  • 0 關(guān)注
  • 1142 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)