3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
這部分解釋了它:
C ++標(biāo)準(zhǔn)03 14.8.1.6:
[注意:對(duì)于簡(jiǎn)單的函數(shù)名稱,即使函數(shù)名稱在調(diào)用范圍內(nèi)不可見(jiàn),依賴于參數(shù)的查找(3.4.2)也適用。這是因?yàn)檎{(diào)用仍然具有函數(shù)調(diào)用的語(yǔ)法形式(3.4.1)。但是當(dāng)使用帶有顯式模板參數(shù)的函數(shù)模板時(shí),除非在調(diào)用點(diǎn)處有一個(gè)具有該名稱的函數(shù)模板,否則調(diào)用沒(méi)有正確的語(yǔ)法形式。如果看不到這樣的名稱,則調(diào)用語(yǔ)法不完善,并且參數(shù)依賴查找不適用。如果某些此類名稱可見(jiàn),則應(yīng)用依賴于參數(shù)的查找,并且可以在其他名稱空間中找到其他函數(shù)模板。
namespace A { struct B { }; template<int X> void f(B);}namespace C { template<class T> void f(T t);}void g(A::B b) { f<3>(b); //ill-formed: not a function call A::f<3>(b); //well-formed C::f<3>(b); //ill-formed; argument dependent lookup // applies only to unqualified names using C::f; f<3>(b); //well-formed because C::f is visible; then // A::f is found by argument dependent lookup}

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
從c ++ 20開(kāi)始,adl與顯式函數(shù)模板一起工作也很好。以下是提議: P0846R0:不可見(jiàn)的ADL和功能模板:
不要求用戶使用template關(guān)鍵字,而是建議對(duì)查找規(guī)則進(jìn)行修訂,以便正常查找產(chǎn)生無(wú)結(jié)果或找到一個(gè)或多個(gè)函數(shù)且后面跟aa“<”的名稱將被視為如果找到了函數(shù)模板名稱并且將導(dǎo)致執(zhí)行ADL。
目前,只有GCC 9實(shí)現(xiàn)了此功能,因此您的示例可以編譯。
live demo
。
- 3 回答
- 0 關(guān)注
- 369 瀏覽
添加回答
舉報(bào)