<分区>
以下程序编译( live demo ),但我不明白为什么。
namespace N {
struct S {};
}
void Foo(N::S);
namespace Lib {
template <class T>
void Call() { Foo(T{}); }
void Foo();
}
int main()
{
Lib::Call<N::S>();
}
不应该Lib::Foo
隐藏::Foo
? Foo
在 Call
是一个依赖名称,依赖名称的评估应该推迟到模板的实例化。在这种情况下名称查找如何工作?
在命名空间 Lib
Foo(N::S{})
可以在声明void Foo();
之前调用, 但不能在声明后调用,因为 Lib::Foo
隐藏 ::Foo
. Lib::Call<N::S>();
在声明之后,所以绑定(bind)名称时 Foo
到这里,隐藏应该生效了吧?