我一直在阅读 Josuttis 模板书,并且一直在尝试将头放在 ADL 上。他说“ADL 通过在命名空间和类中查找名称来“与”调用参数的类型“相关联”。我只是想看看它是如何在班级中查找名称的。我在下面放了一个测试示例。我看到它如何在命名空间中查找名称。
class bryan_ns {
public:
class bryan {
public:
enum E { e1 };
static void bryan_test() { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
void f(bryan::E) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
void f(int)
{
std::cout << "::f(int) called\n";
}
int main()
{
f(bryan_ns::bryan::e1); // calls ::f(int)
}
但是,如果我将 bryan_ns 更改为这样的命名空间:
namespace bryan_ns {
public:
class bryan {
public:
enum E { e1 };
static void bryan_test() { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
void f(bryan::E) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
void f(int)
{
std::cout << "::f(int) called\n";
}
int main()
{
f(bryan_ns::bryan::e1); // calls bryan_ns::f(bryan::E)
}