Argument dependent name lookup (又称作Koening name lookup)
它的含义是指,对于未通过命名空间限定的函数调用(英文叫unqualified),编译器会参照各个参数所在的命名空间,去查找相应函数的定义和声明。将起来太抽象,举个例子
#includenamespace Layer1 { class ClassInLayer1 { public: ClassInLayer1() = default; }; void foobar(ClassInLayer1 c) { std::cout << "foobar in Layer 1" << std::endl;} }; namespace Layer2 { class ClassInLayer2 { public: ClassInLayer2() = default; }; void foobar(ClassInLayer2 c) { std::cout << "foobar in Layer 2" << std::endl;} } int main() { Layer1::ClassInLayer1 c1; Layer2::ClassInLayer2 c2; foobar(c1); foobar(c2); return 0; }
可以看到,main函数中有两个foobar的函数调用,其中一个的入参是Layer1::ClassInLayer1,而另一个是Layer2::ClassInLayer2。虽然这两个foobar都没有用命名空间去限定(完整的写法应该是Layer1::foobar(c)),此时编译器会根据入参所在的命名空间,去寻找相应的函数定义。程序的输出是
ken@ken-N56VZ ~/Documents/trialInferno/C++ $ ./a.outfoobar in Layer 1foobar in Layer 2