Dr.*_*Gut 7 c++ linkage dependent-name language-lawyer argument-dependent-lookup
模板中使用的从属名称的查找被推迟到知道模板参数为止,这时ADL会检查具有外部链接的函数声明,这些声明从模板定义上下文或模板实例化上下文中可见。
与此相反,以下代码片段可以使用三个编译器(MSVC,clang和gcc)很好地进行编译:
template <class T>
void CallFoo ()
{
Foo (T ());
}
class Apple {};
int main ()
{
CallFoo<Apple> ();
}
static void Foo (Apple)
{
}
Run Code Online (Sandbox Code Playgroud)
Foo是以下内容中的从属名称CallFoo:它取决于模板参数T。但是,Foo尽管违反了上面引用的两个规则,但是编译器仍然可以找到该函数。
Foo从的定义或实例中都看不到的声明CallFoo,因为它位于两者之下。Foo 有内部联系。这三个编译器都不可能有错误。我可能误会了一些东西。您能详细说明一下吗?
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |