C ++中依赖的限定名称查找14

时间:2014-11-10 01:19:58

标签: c++ templates language-lawyer c++14 overload-resolution

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

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

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

  

对于依赖于模板参数的函数调用,使用通常的查找规则(3.4.1,3.4.2,3.4.3)找到候选函数,除了:

     
      
  • 对于使用非限定名称查找(3.4.1)或限定名称查找(3.4.3)的查找部分,只能找到模板定义上下文中的函数声明。
  •   
  • 对于使用关联命名空间(3.4.2)的查找部分,只能找到模板定义上下文或模板实例化上下文中找到的函数声明。
  •   

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

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

  

对于 postfix-expression 是从属名称的函数调用,使用通常的查找规则(3.4.1,3.4.2)找到候选函数,但:

     
      
  • 对于使用非限定名称查找(3.4.1)的查找部分,只能找到模板定义上下文中的函数声明。
  •   
  • 对于使用关联命名空间(3.4.2)的查找部分,只能找到模板定义上下文或模板实例化上下文中找到的函数声明。
  •   

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

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

1 个答案:

答案 0 :(得分:2)

缺陷报告1321已被最新的C ++ 14草案(N4140)所接受。此缺陷报告阐明了从属名称的等效性,同时阐明了从属名称必须是 unqualified-id 。以前,在C ++ 11中,依赖名称可以是任意 id-expression

这意味着 qualified-id 名称不再是依赖名称,因此根据§14.6.3[temp.nondep]进行查找。这实际上并不影响C ++ 11中的程序行为,因为依赖名称仅影响是否使用模板实例化上下文执行ADL(§3.4.2),并且只有 unqualified-id s才符合条件对于ADL无论如何。