我写了以下代码,一半期望默认参数触发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;
    }
}


我们可以在标志或标签上玩吗?

09-11 18:56
查看更多