我無法理解參數相關(Koenig)查找背後的規則。基於參數的查找 - 何時完成,搜索什麼,以及如何強制(或阻止)它?
考慮下面的代碼:
#include <iostream>
using namespace std;
namespace adl
{
struct Test { };
void foo1(Test const &) { cout << "ADL used (foo1)" << endl; }
void foo2(Test const &) { cout << "ADL used (foo2)" << endl; }
void foo3(Test const &) { cout << "ADL used (foo3)" << endl; }
}
struct foo1
{
foo1() { }
template<class T>
foo1(T const &) { cout << "ADL not used (foo1)" << endl; }
template<class T>
void operator()(T const &) const { cout << "ADL not used (foo3)" << endl; }
};
template<class T> void foo2(T const &)
{ cout << "ADL not used (foo2)" << endl; }
int main()
{
adl::Test t;
foo1 foo3;
(foo1(t));
(foo2(t));
(foo3(t));
}
它的輸出是:
ADL不使用(
foo1
)
ADL使用(foo2
)
ADL不使用(foo3
)
我e他們認爲所有人都使用ADL,但我很驚訝,只有他們中的一些人做到了。
什麼是(潛在的血管,我知道)細節背後的ADL規則?
我很理解這個概念,但細節就是我遇到的問題。
搜索哪些範圍,何時搜索以及何時不搜索?
是它在所有可能告訴ADL是否無需通過所有的#include
「d文件,以尋找代碼定行之前使用?我期望仿函數和函數在掩蓋ADL方面表現出相同的行爲,但顯然他們不行。
有沒有辦法通過force ADL在沒有自動完成的情況下(比如上面的情況)並且你不知道類的命名空間(例如在模板中)?
-1這個問題太廣泛了,代碼示例真的很糟糕(帶有誤導性的名字等)。 –
我不明白。你爲什麼要試驗'(foo3(t));'?沒有名爲'foo3'的函數。所以ADL不會進入畫面。 'foo3'將被視爲對象,毫無疑問,因爲這就是它的意思(這意味着它將毫無疑問地調用'operator()')!這只是您在示例中使用的誤導性名稱。 – Nawaz
@ Cheersandhth.-Alf:但是對'(foo3(t))'沒有混淆;'。這只是他爲變量使用了誤導性的名字! – Nawaz