我编写了以下代码,希望默认参数触发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
}
答案 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;这是函数在声明中指定的名称/类型。