ADL 和非类型模板参数

ADL and non-type template parameters

本文关键字:参数 类型 ADL      更新时间:2023-10-16

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

namespace N
{
const int c = 1;
void func(...) {}
}
template <int r>
void tfunc () {}
int main ()
{
func(tfunc<N::c>);  // Error!
}

我正在寻找的是一个示例,可以说明为什么这是一个坏主意。

答案由@IgorTandetnik提供。

它类似于typedefs。在那里,typedef 名称(及其关联的命名空间(不用于指导 ADL - 由 typedef 命名的实际类型是。在这里,同样,引用整数常量的名称不用于指导 ADL(您可能会说实际常量是 - 除了那些没有关联的命名空间,因此它们的参与是微不足道的(。换句话说,目的是func(tfunc<N::c>)func(tfunc<1>)的行为相同。