模板中使用的依赖名称的查找被推迟到知道模板参数之前,此时 [...] ADL 检查具有外部链接的函数声明,这些链接可以从模板定义上下文或模板实例化上下文中看到。
与此相反,以下代码片段可以使用三个编译器(MSVC、clang、gcc)正常编译:
template <class T>
void CallFoo ()
{
Foo (T ());
}
class Apple {};
int main ()
{
CallFoo<Apple> ();
}
static void Foo (Apple)
{
}
Foo
是一个依赖名称CallFoo
:它依赖于模板参数T
。但是,Foo
尽管违反了上面引用的两个规则,但编译器还是找到了该函数。
Foo
从 的定义或实例化中都看不到的声明CallFoo
,因为它在两者之下。Foo
有内部联系。
三个编译器都不太可能有错误。我可能误会了什么。你能详细说明一下吗?