When is ADL applied?

前端 未结 2 1726
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-20 02:06

There are 3 examples:

I.

typedef int foo;

namespace B
{
    struct S
    {
        operator int(){ return 24; }
    };
        int foo(B::S s){ retu         


        
2条回答
  •  臣服心动
    2021-01-20 02:35

    Your first example does not illustrate ADL. In the line

    int t=foo(B::S());
    

    foo is typedefed to int.

    The following code has some better illustrations of ADL.

    #include 
    
    namespace B
    {
        struct S
        {
            operator int(){ return 24; }
        };
    
        int foo(S s){ return 100; }
        int bar(S s){ return 400; }
    }
    
    namespace C
    {
        struct S
        {
            operator int(){ return 24; }
        };
    
        int foo(S s){ return 200; }
    }
    
    int bar(C::S s){ return 800; }
    
    int main()
    {
        // ADL makes it possible for foo to be resolved to B::foo
        std::cout << foo(B::S()) << std::endl;
    
        // ADL makes it possible for foo to be resolved to C::foo
        std::cout << foo(C::S()) << std::endl;
    
        // ADL makes it possible for bar to be resolved to B::bar
        std::cout << bar(B::S()) << std::endl;
    
        // ADL makes it possible for bar to be resolved to ::bar
        std::cout << bar(C::S()) << std::endl;
    }
    

提交回复
热议问题