编译:
struct type{};
template<typename T>
void foo(T in) { bar(in, type()); }
void bar(int, const type&) {}
int main() { foo(42); }
这不是(正如我在previous question from today中所了解的那样):
template<typename T>
void foo(T in) { bar(in); }
void bar(int) {}
int main() { foo(42); }
第一个代码片段编译的原因是否也用ADL解释?如果是这样,怎么样?
模板参数是基本类型,ADL不适用于它...为什么使用类型type
会有什么不同?
答案 0 :(得分:2)
虽然在具体的专业化in
是基本类型,但bar
仍然是一个从属名称,因此其查找的参数依赖部分是在实例化上下文中执行的。使其依赖的参数没有关联的命名空间这一事实是无关紧要的。所有非依赖参数仍然有助于关联的命名空间和类的集合。