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为“普通”非限定id查找,3.4.2为函数名(又名.ADL)的非限定id查找,3.4.3为限定id查找]

但是,在C++14(N3936)中,有关合格id查找的部分被删除:

对于后缀表达式为从属名称的函数调用,使用常用的查找规则(3.4.1、3.4.2)查找候选函数,但以下情况除外:

  • 对于使用非限定名称查找(3.4.1)的查找部分,只能找到模板定义上下文中的函数声明
  • 对于使用关联名称空间(3.4.2)的查找部分,只能找到在模板定义上下文或模板实例化上下文中找到的函数声明
假设这一变化是故意的;在后缀表达式是从属名称和限定id的函数调用中,哪些子句现在涵盖了查找候选函数

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

缺陷报告已被最新的C++14草稿(N4140)接受。此缺陷报告澄清了依赖名称的等效性,同时澄清了依赖名称必须是非限定id。以前,在C++11中,依赖名称可以是任意id表达式


这意味着限定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中的程序行为?