【发布时间】:2019-08-26 18:33:45
【问题描述】:
This description on cppreference.com 这么说
模板中使用的依赖名称的查找被推迟,直到模板参数已知,此时 [...] ADL 检查具有 外部链接 的函数声明,这些声明可从任一模板定义上下文或模板实例化上下文。
与此相反,以下代码 sn-p compiles fine 带有三个编译器(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有内部链接。
这三个编译器都不太可能有错误。我可能误会了什么。你能详细说明一下吗?
【问题讨论】:
标签: c++ language-lawyer linkage argument-dependent-lookup dependent-name