我写了以下代码,一半期望默认参数触发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
}
最佳答案
ADL仅与您提供的参数一起使用,否则情况将非常可怕,名称空间在隔离其内容时将变得毫无用处。
想一想,如果您也有这种情况会发生什么:
namespace fun {
struct tag {};
void fun(tag = {})
{
std::cout << "Fun with tags!" << std::endl;
}
}
我们可以在标志或标签上玩吗?