[英]ADL without templates
有人可以向我展示一個不使用模板的 ADL 示例嗎? 從來沒有見過這樣的事情。 我的意思是 這里。 具體來說,我對導致某些陷阱的示例感興趣,例如提到的。
編輯:
我認為托馬拉克的答案可以擴展到陷阱。 考慮一下:
namespace dupa {
class A {
};
class B : public A {
public:
int c;
B() {
}
};
void f(B b) {
printf("f from dupa called\n");
}
}
void f(dupa::A) {
printf("f from unnamed namespace called\n");
}
int main()
{
dupa::B b;
f(b);
return 0;
}
在這里,我們期望調用來自未命名命名空間的 f,而是調用另一個命名空間。
我無法向您展示導致陷阱的東西,但我可以演示ADL 在沒有模板的情況下工作:
namespace foo {
struct T {} lol;
void f(T) {}
}
int main() {
f(foo::lol);
}
請注意, lol
的類型必須是class-type
; 如您所見,我最初嘗試使用內置的,但它不起作用。
混淆的訣竅是創建一個場景,其中 arguments 到 function 是可互換或可轉換的,並且 ADL 可能會選擇一些可能不是您所期望的東西。 我不確定這是否令人印象深刻或只是意料之中:
namespace a {
struct A {};
void f( A* ) { std::cout << "a::f" << std::endl; }
}
namespace b {
struct B : ::a::A {};
void f( B* ) { std::cout << "b::f" << std::endl; }
}
void test() {
f( new b::B ); // b::f
a::A* p = new b::B;
f( p ); // a::f
}
類型相同,但 ADL 將檢查參數的 static 類型並將該命名空間添加到搜索中。 這反過來意味着確切的 static 類型可能使編譯器可以看到不同的函數。 當 ADL 或重載決議可以應用的參數不止一個時,事情可能會更加混亂。
沒有模板。
使用 swap() 因為這是最常見的用法。
#include <iostream>
namespace One
{
class A {};
void swap(A& lhs, A& rhs) { std::cout << "Swap-One A\n";}
}
namespace Two
{
class A {};
void swap(A& lhs, A& rhs) { std::cout << "Swap-Two A\n";}
}
int main()
{
One::A oneA_l;
One::A oneA_r;
Two::A twoA_l;
Two::A twoA_r;
swap(oneA_l, oneA_r);
swap(twoA_l, twoA_r);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.