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

时间:2015-11-28 15:03:43

标签: c++ argument-dependent-lookup

考虑简单的代码:

template<int N> struct foo{};

namespace N
{
    const int a=1;
    void bar(foo<1>& x){}
}

int main()
{
    bar(foo<N::a>());
    return 0;
}

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

1 个答案:

答案 0 :(得分:4)

[basic.lookup.argdep] / 2:

  

[注意:非类型模板参数不会对相关命名空间的集合做出贡献。-end note]

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

例如,如果您的代码如下:

namespace A { 
    class T {};
}

namespace B { 
    typedef A::T TT;
}

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