为什么函数fun不符合ADL的要求?

3

我有一个简单的命名空间,其中包含一个变量和一个函数。在main中,我尝试调用没有命名空间限定符的函数,并使用命名空间限定符调用变量。

namespace SAM
{
    int p = 10;
    void fun(int)
    {
        cout<<"Fun gets called";
    }
} 

int main()
{

    fun(SAM::p);//why SAM::fun is not get called?
    return 0;
}

我不能调用fun函数,为什么不符合ADL(参数相关的名称查找)条件?

在Visual Studio中,我遇到了以下错误。

'fun':未找到标识符

如果我使用 SAM::fun,它可以工作。

1个回答

5

ADL适用于类型,而不是变量,例如:

namespace SAM
{
    struct P {};
    void fun(P)
    {
        cout<<"Fun gets called";
    }
} 

int main()
{
    SAM::P p;
    fun(p);
    return 0;
}

在C++编程语言中,参数依赖查找 (ADL) 或称为参数依赖名称查找,适用于基于函数调用时传递的参数类型对未限定的函数名进行查找。请参考:Argument-dependent name lookup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接