ADL和非类型模板参数

问题描述 投票:0回答:1

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

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

template <int r>
void tfunc () {}

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

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

c++ argument-dependent-lookup
1个回答
0
投票

答案由@IgorTandetnik提供。

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

© www.soinside.com 2019 - 2024. All rights reserved.