为什么参数依赖查找不能使用默认参数?

时间:2016-10-27 18:06:05

标签: c++ argument-dependent-lookup default-arguments

我编写了以下代码,希望默认参数触发ADL。它没有(我得到了编译器错误) 是否需要显式参数来触发ADL?

#include <iostream>

namespace sheldon
{
    enum FLAG{ USA , UK , EU };

    void fun( FLAG f = USA )
    {
        std::cout << "Fun with flags!" << std::endl;
    }
}

int main()
{
    fun();  // Does not compile
    // fun( sheldon::USA ); // compiles
}

3 个答案:

答案 0 :(得分:3)

当编译器遇到函数调用表达式时,它首先构建一组可能要调用的函数,然后执行重载解析。 ADL是过载集生成的一部分 现在,来到这个声明时:

fun();

首先,它在全局命名空间中查找可能的重载。它找不到。
然后它根据参数传递进行ADL,但是你没有传递任何参数 因此,重载集是空的。

答案 1 :(得分:2)

ADL只适用于您提供的参数,否则事情会非常糟糕,命名空间在隔离其内容时会变得毫无用处。
想想如果你也有这种情况会发生什么:

namespace fun {
    struct tag {};
    void fun(tag = {})
    {
        std::cout << "Fun with tags!" << std::endl;
    }
}

我们可以玩旗帜或标签吗?

答案 2 :(得分:2)

以下函数调用:

fun();

不包含任何参数,因此无法触发与参数相关的查找。

澄清,&#34;论证&#34;引用调用函数时传递的实际值/引用,而不是&#34;参数&#34;这是函数在声明中指定的名称/类型。