【发布时间】:2015-01-06 06:11:43
【问题描述】:
这是关于模板函数中的依赖名称查找,例如:
template<class T>
void foo(T const &t)
{
::func(t);
}
在此代码中,func 是一个依赖名称,因为它有一个依赖于类型的表达式作为函数调用的参数。在 C++11 中,func 的查找由 [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 是“普通”的非限定 ID 查找,而 3.4.2 是函数名称的非限定 ID 查找,又名。 ADL,而 3.4.3 是qualified-id lookup]。
但是在 C++14 (N3936) 中,关于 qualified-id 查找的部分被删除了:
对于 后缀表达式 是依赖名称的函数调用,使用通常的查找规则(3.4.1、3.4.2)找到候选函数,除了:
- 对于使用非限定名称查找 (3.4.1) 的查找部分,只能找到来自模板定义上下文的函数声明。
- 对于使用关联命名空间 (3.4.2) 的查找部分,只能找到在模板定义上下文或模板实例化上下文中找到的函数声明。
假设此更改是故意进行的;哪些子句现在涵盖为后缀表达式是依赖名称和限定 ID 的函数调用寻找候选函数?
(背景:我正在寻找确认限定名称查找仍然只在模板定义上下文中查找,而不是在实例化上下文中查找)。
【问题讨论】:
-
C++14 你用的是哪个草稿,b/c
N3936不是这样读的。 -
能否也提供该草稿的链接?
-
@ShafikYaghmour 已修复。我以为我会复制粘贴以避免再次进行所有引用/要点格式化,但把它弄得一团糟
标签: c++ templates language-lawyer c++14 overload-resolution