簡體   English   中英

沒有模板的 ADL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM