查找奇怪的行为

时间:2017-02-05 17:53:53

标签: c++ c++11

正常查找失败时正在运行c ++ ADL查找,在此示例中,我收到有关模糊g调用的错误。我认为正常查找应该只找到B :: g。为什么我错了?

namespace A
    {
        struct X{
        };

        struct Y{
        };

        void g(X){
        }
        void h(){

        }

    }

    namespace B
    {
        void g(A::X x);
        void g(A::X x) { g(x);}

    }

错误:

error: call to 'g' is ambiguous
    void g(A::X x) { g(x);  }
                     ^
c0202.cpp:9:10: note: candidate function
    void g(X){
         ^
c0202.cpp:20:10: note: candidate function
    void g(A::X x) { g(x);  }

1 个答案:

答案 0 :(得分:4)

  

正常查找失败时正在运行c ++ ADL查找

不,依赖于参数的查找总是与正常查找一起发生。这就是重点。

假设你有

struct S { /* ... */ };
void swap(S &, S &) { /* ... */ }

您不希望标准库函数(在std命名空间中定义)无法找到此用户定义的swap函数,是吗?他们总是能够看到std::swap,因为他们自己是std命名空间的一部分,但他们可能仍然更喜欢ADL找到的::swap