C++14中的依赖限定名查找
Dependent qualified name lookup in C++14
这是关于模板函数中的依赖名称查找,例如:
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。
相关文章:
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 限定的依赖名称查找,其中包含基类的注入类名
- 在链接可执行文件之前查找静态库未解析的依赖项
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 为什么在这种情况下不考虑依赖于参数的查找?
- 非依赖名称查找和 lambda
- 我如何避免使用依赖于参数的查找明确专门化模板化功能
- 显式模板专用化和依赖名称查找问题
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- 依赖于模板参数的范围查找
- 依赖于参数的查找在来自另一个命名空间的别名类型上意外行为
- 依赖于参数的名称查找:添加要查找的额外命名空间
- 通过模板类的基进行依赖于参数的查找
- C++成员函数的依赖非限定名的两阶段查找
- 为什么这个依赖名称查找查找的是全局标识符而不是方法
- 用于查找可执行文件依赖项的命令
- C++ 查找依赖文件
- 我在一个简单的参数依赖查找/模板类型推断问题方面遇到问题
- C++14中的依赖限定名查找
- LoadLibrary调用DLL时正在查找依赖DLL