ADL和非类型模板参数

时间:2019-12-09 09:42:35

标签: c++ argument-dependent-lookup

非类型模板参数不考虑ADL。是什么原因呢?我最初的想法是引入ADL来解决运算符和名称空间之间的冲突,并且运算符重载不使用非类型模板参数。我不确定这是正确的。 那么,为什么不允许以下内容?

namespace N
{
    const int c = 1;
    void func(...) {}
}

template <int r>
void tfunc () {}

int main ()
{
    func(tfunc<N::c>);  // Error!
}

我要寻找的是一个示例,演示了为什么这是一个坏主意。

1 个答案:

答案 0 :(得分:0)

答案由@IgorTandetnik提供。

类似于typedef。在那里,typedef名称(及其关联的名称空间)不用于指导ADL-由typedef命名的实际类型是。在这里,类似地,不使用引用整数常量的名称来指导ADL(您可以说实际的常量是-除非那些没有关联的名称空间,所以它们的参与是微不足道的)。换句话说,目的是func(tfunc<N::c>)func(tfunc<1>)表现相同。