非类型模板参数不考虑ADL。是什么原因呢?我最初的想法是引入ADL来解决运算符和名称空间之间的冲突,并且运算符重载不使用非类型模板参数。我不确定这是正确的。 那么,为什么不允许以下内容?
namespace N
{
const int c = 1;
void func(...) {}
}
template <int r>
void tfunc () {}
int main ()
{
func(tfunc<N::c>); // Error!
}
我要寻找的是一个示例,演示了为什么这是一个坏主意。
答案 0 :(得分:0)
答案由@IgorTandetnik提供。
类似于typedef。在那里,typedef名称(及其关联的名称空间)不用于指导ADL-由typedef命名的实际类型是。在这里,类似地,不使用引用整数常量的名称来指导ADL(您可以说实际的常量是-除非那些没有关联的名称空间,所以它们的参与是微不足道的)。换句话说,目的是func(tfunc<N::c>)
和func(tfunc<1>)
表现相同。