基本和用户定义类型的名称查找问题

时间:2017-09-15 16:22:05

标签: c++ templates language-lawyer argument-dependent-lookup name-lookup

编译:

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会有什么不同?

1 个答案:

答案 0 :(得分:2)

虽然在具体的专业化in是基本类型,但bar仍然是一个从属名称,因此其查找的参数依赖部分是在实例化上下文中执行的。使其依赖的参数没有关联的命名空间这一事实是无关紧要的。所有非依赖参数仍然有助于关联的命名空间和类的集合。