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

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

什么是“依賴于參數(shù)的查找”(又名ADL,還是“Koenig Lookup”)?

什么是“依賴于參數(shù)的查找”(又名ADL,還是“Koenig Lookup”)?

C++ C
叮當(dāng)貓咪 2019-06-03 16:28:05
什么是“依賴于參數(shù)的查找”(又名ADL,還是“Koenig Lookup”)?關(guān)于什么是依賴于查找的論點(diǎn),有什么好的解釋?許多人也稱它為Koenig Lookup。最好我想知道:為什么這是件好事?為什么這是件壞事?它怎麼工作?
查看完整描述

4 回答

?
胡子哥哥

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊

在Koenig查找中,如果調(diào)用一個(gè)函數(shù)而不指定其命名空間,則函數(shù)的名稱為在定義參數(shù)類型的命名空間中搜索。這就是為什么它也被稱為參數(shù)相關(guān)名稱查找簡(jiǎn)單地說(shuō)ADL.

正是由于Koenig查找,我們可以這樣寫:

std::cout << "Hello World!" << "\n";

否則,我們將不得不寫:

std::operator<<(std::operator<<(std::cout, "Hello World!"), "\n");

這真的是太多的輸入和代碼看起來(lái)真的很難看!

換句話說(shuō),在沒(méi)有Koenig查找的情況下,甚至你好世界程序看起來(lái)很復(fù)雜。


查看完整回答
反對(duì) 回復(fù) 2019-06-03
?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊

也許最好從為什么開(kāi)始,然后再去如何。

當(dāng)引入名稱空間時(shí),想法是在名稱空間中定義所有內(nèi)容,這樣單獨(dú)的庫(kù)就不會(huì)相互干擾。然而,這給運(yùn)營(yíng)商帶來(lái)了一個(gè)問(wèn)題。例如,查看以下代碼:

namespace N{
  class X {};
  void f(X);
  X& operator++(X&);}int main(){
  // define an object of type X
  N::X x;

  // apply f to it
  N::f(x);

  // apply operator++ to it
  ???}

你當(dāng)然可以寫N::operator++(x),但這會(huì)使操作者超載的整個(gè)問(wèn)題化為烏有。因此,必須找到允許編譯器找到的解決方案。operator++(X&)盡管它不在范圍之內(nèi)。另一方面,它仍然找不到另一個(gè)operator++定義在另一個(gè)不相關(guān)的名稱空間中,這可能會(huì)使調(diào)用變得模糊(在這個(gè)簡(jiǎn)單的示例中,不會(huì)出現(xiàn)歧義,但在更復(fù)雜的示例中,可能會(huì)出現(xiàn)歧義)。解決方案是參數(shù)依賴查找(ADL),因?yàn)椴檎乙蕾囉趨?shù)(更確切地說(shuō),取決于參數(shù)的類型)。由于該方案是由AndrewR.Koenig發(fā)明的,因此也常被稱為Koenig查找。

訣竅是,對(duì)于函數(shù)調(diào)用,除了普通的名稱查找(在使用點(diǎn)上查找作用域中的名稱)之外,在給定給函數(shù)的參數(shù)類型的范圍內(nèi)進(jìn)行第二次查找。因此,在上面的示例中,如果您編寫x++總的來(lái)說(shuō),它是在尋找operator++不僅在全局范圍內(nèi),而且在xN::X的定義,即namespace N..在那里它找到了一個(gè)匹配的operator++,因此x++只是起作用了。另一個(gè)operator++在另一個(gè)名稱空間中定義,例如N2卻找不到。由于ADL不限于命名空間,所以您也可以使用f(x)而不是N::f(x)在……里面main().


查看完整回答
反對(duì) 回復(fù) 2019-06-03
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

在我看來(lái),并不是所有的事情都是好的。人們,包括編譯器供應(yīng)商,一直在侮辱它,因?yàn)樗袝r(shí)是不幸的行為。

ADL負(fù)責(zé)對(duì)C+11中的量程回路進(jìn)行大修.要理解為什么ADL有時(shí)會(huì)產(chǎn)生意想不到的效果,請(qǐng)考慮不僅要考慮定義參數(shù)的命名空間,還要考慮參數(shù)的模板參數(shù)、函數(shù)類型的參數(shù)類型/指針類型的參數(shù)類型、這些參數(shù)的指針類型等等。

一個(gè)使用Boost的例子

std::vector<boost::shared_ptr<int>> v;auto x = begin(v);

如果用戶使用了.range庫(kù),這會(huì)導(dǎo)致歧義,因?yàn)檫@兩個(gè)庫(kù)都是std::begin被找到(由ADL使用std::vector)和boost::begin被找到(由ADL使用boost::shared_ptr).


查看完整回答
反對(duì) 回復(fù) 2019-06-03
  • 4 回答
  • 0 關(guān)注
  • 1038 瀏覽

添加回答

舉報(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)