C++ C+中的依赖限定名查找+;14
这是关于模板函数中的从属名称查找,例如:C++ C+中的依赖限定名查找+;14,c++,templates,language-lawyer,c++14,overload-resolution,C++,Templates,Language Lawyer,C++14,Overload Resolution,这是关于模板函数中的从属名称查找,例如: template<class T> void foo(T const &t) { ::func(t); } 模板 void foo(T const&T) { ::func(t); } 在这段代码中,func是一个依赖名称,因为它有一个类型依赖表达式作为函数调用的参数。在C++11中,[temp.dep.candidate]/1涵盖了对func的查找: 对于依赖于模板参数的函数调用,使用常用的查找规则(3.4.1、3.4.2
template<class T>
void foo(T const &t)
{
::func(t);
}
模板
void foo(T const&T)
{
::func(t);
}
在这段代码中,func
是一个依赖名称,因为它有一个类型依赖表达式作为函数调用的参数。在C++11中,[temp.dep.candidate]/1涵盖了对func
的查找:
对于依赖于模板参数的函数调用,使用常用的查找规则(3.4.1、3.4.2、3.4.3)查找候选函数,但以下情况除外:
- 对于使用非限定名称查找(3.4.1)或限定名称查找(3.4.3)的查找部分,只能找到模板定义上下文中的函数声明
- 对于使用关联名称空间(3.4.2)的查找部分,只能找到在模板定义上下文或模板实例化上下文中找到的函数声明
- 对于使用非限定名称查找(3.4.1)的查找部分,只能找到模板定义上下文中的函数声明
- 对于使用关联名称空间(3.4.2)的查找部分,只能找到在模板定义上下文或模板实例化上下文中找到的函数声明
这意味着限定id名称不再是从属名称,因此根据§14.6.3[临时非DEP]进行查找。这实际上并不影响C++11中的程序行为,因为依赖名称只影响是否使用模板实例化上下文执行ADL(§3.4.2),并且只有不合格的ID才有资格使用ADL。您对C++14使用的是哪种草稿,b/c
N3936
读起来不是那样的。你能提供一个指向该草稿的链接吗?请@ShafikYaghmour修复。我原以为我会复制粘贴以避免再次执行所有引号/项目符号格式设置,但结果弄糟了。@nneonneo这不会影响C++11
中的程序行为。我不明白。在C++11中,对于依赖于模板参数的函数调用,可以从模板定义上下文执行限定名称查找。现在在C++14中,这是不可能的!为什么这不会影响C++11中的程序行为?