ADL 不考虑与模板参数关联的命名空间吗?

Doesn't ADL considers namespaces associated with template argument?

本文关键字:命名空间 关联 参数 不考虑 ADL      更新时间:2023-10-16

考虑一下简单的代码:

template<int N> struct foo{};
namespace N
{
    const int a=1;
    void bar(foo<1>& x){}
}
int main()
{
    bar(foo<N::a>());
    return 0;
}

代码不应该工作吗?为什么它不起作用我想知道。感谢

[basic.lookup.argdep]/2:

[注意:非类型模板参数对相关名称空间集没有贡献。--结束注释]

对于注释中链接的代码,命名空间中的typedef也不够,但还有其他原因。查找基于解析的类型,而不是基于包含typedef本身(或者等效地,using)的命名空间。

例如,如果您有以下代码:

namespace A { 
    class T {};
}
namespace B { 
    typedef A::T TT;
}

使用B::TT作为参数会将namespace A添加到查找,但不会将namespace B添加到查找。