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

Dependent qualified name lookup in C++14

本文关键字:查找 依赖 C++14      更新时间:2023-10-16

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

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

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

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

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

[注:3.4.1为"普通"不合格id查找,3.4.2为函数名的不合格id查询,即ADL,3.4.3为合格id查找]。

然而,在C++14(N3936)中,关于合格id查找的部分被删除:

对于后缀表达式是依赖名称的函数调用,使用通常的查找规则(3.4.13.4.2)查找候选函数,但以下情况除外:

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

假设此更改是故意的;在后缀表达式是依赖名称和限定id的情况下,哪些子句现在涵盖了为函数调用查找候选函数?

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

缺陷报告1321已被接受为最新的C++14草案(N4140)。该缺陷报告澄清了从属名称的等效性,同时澄清了从属名必须是不合格的id。以前,在C++11中,依赖名称可以是任意的id表达式s。

这意味着合格的id名称不再是依赖名称,因此根据§14.6.3[temp.ndep]进行查找。这实际上不会影响C++11中的程序行为,因为依赖名称只影响ADL(§3.4.2)是否使用模板实例化上下文执行,并且只有不合格的id[/em>才有资格进行ADL。