A izlenerek-bildirimi sıradan beyan olarak hareket eder. Eğer using B::f
yaptığınızda
temelde hiçbir şey değiştirin. Yerel olarak, zaten zaten göründüğü yerde B::f
'u yeniden işaretleyin. Bu, A::f
ve B::f
arasındaki belirsizliği yaratan ADL'nin A::f
'u bulmasını engellemez.
using A::f
yaparsanız, A::f
yerel bildirimi, B::f
dış bildirimini gizler. Bu nedenle B::f
artık görünür değil ve artık nitelenmemiş ad aramasıyla bulunamadı. Artık sadece A::f
bulundu, yani artık bir belirsizlik yok.
O ADL bastırmak mümkün değildir. Davanızdaki argüman türündedir,işlevi her zaman ADL tarafından
f
niteliksiz ad için bulunur. Bunu göz ardı edemezsin. Bu, belirsizlik yaratmadan
B::f
'u dikkate alamazsınız anlamına gelir. Etrafında tek yol nitelikli bir isim kullanmaktır. @Richard Smith gibi
doğru açıklamalarda belirtildiği, ADL bastırılabilir. ADL yalnızca işlev isminin kendisi işlev çağrısında postfix ifadesi olarak kullanıldığında kullanılır. Hedef işlevini başka bir şekilde belirtmek, ADL'yi bozar. Örneğin
, fonksiyon ibrenin başlatma çağrılır Yukarıdaki örnekte B::f
olarak
void g(A::X x)
{
void (*pf)(A::X) = &f;
pf(x);
}
ADL
tabi değildir. Ve işlev adının etrafında
()
bile sadece çifti
void g(A::X x)
{
(f)(x);
}
o B::f
çağrı yapmak için zaten yeterlidir yani ADL bastırmak için yeterlidir.
İşlev adını parantez içine alarak çağrı sitesinde ADL'yi kaldırabilirsiniz. '(F) (x)' yi kullanmak belirsizliği giderir. –
Açıkçası, B :: f; 'kullanarak yukarıdaki kod alıntılarının hiçbirine gerek yoktur – Tony