C 14中的从属限定名称查找

这是关于模板函数中的依赖名称查找,例如:

template<class T>
void foo(T const &t)
{
    ::func(t);
}

在此代码中,func是一个依赖名称,因为它具有依赖于类型的表达式作为函数调用的参数.在C 11中,[temp.dep.candidate] / 1覆盖了func的查找:

For a function call that depends on a template parameter, the candidate functions are found using the usual lookup rules (3.4.1, 3.4.2, 3.4.3) except that:

  • For the part of the lookup using unqualified name lookup (3.4.1) or qualified name lookup (3.4.3), only function declarations from the template definition context are found.
  • For the part of the lookup using associated namespaces (3.4.2), only function declarations found in either the template definition context or the template instantiation context are found.

[注意:3.4.1是“普通”unqualified-id查找,3.4.2是函数名称的非限定id查找,又名. ADL和3.4.3是qualified-id lookup].

但是在C 14(N3936)中删除了有关qualified-id查找的部分:

For a function call where the postfix-expression is a dependent name, the candidate functions are found using the usual lookup rules (3.4.1, 3.4.2) except that:

  • For the part of the lookup using unqualified name lookup (3.4.1), only function declarations from the template definition context are found.
  • For the part of the lookup using associated namespaces (3.4.2), only function declarations found in either the template definition context or the template instantiation context are found.

假设这个改变是故意的;现在哪些条款涵盖函数调用的候选函数的发现,其中postfix-expression是依赖名称和qualified-id?

(背景:我正在寻找确认,限定名称查找仍然只在模板定义上下文中查找,而不是实例化上下文).

最佳答案 缺陷报告
1321已被最新的C 14草案(N4140)接受.此缺陷报告阐明了从属名称的等效性,同时阐明了从属名称必须是非限定ID.以前,在C 11中,从属名称可以是任意的id表达式.

这意味着qualified-id名称不再是依赖名称,因此根据§14.6.3[temp.nondep]进行查找.这实际上并不影响C 11中的程序行为,因为依赖名称仅影响是否使用模板实例化上下文执行ADL(第3.4.2节),并且只有非限定ID才能适用于ADL.

点赞