我一直在阅读 Exceptional C++ by Herb Sutter
。到达 Item 32
时
我发现了以下内容
namespace A
{
struct X;
struct Y;
void f( int );
void g( X );
}
namespace B
{
void f( int i )
{
f( i ); // which f()?
}
}
但是当我做了以下..
namespace A
{
struct X;
struct Y;
void f( int );
void g( X );
}
namespace B
{
using namespace A;
void f( int i )
{
f( i ); // No error, why?
}
}
这意味着赫伯·萨特完全错了?如果不是为什么我没有收到错误?
最佳答案
using 声明( using A::f
)和 using 指令( using namespace A
)之间存在细微差别。
using 声明将名称引入使用它的范围,因此 using A::f
使 f
定义中对 B::f(int)
的调用产生歧义。
using 定义使命名空间的成员在使用它的范围内可见,但它们看起来好像来自引入的命名空间和使用 using 指令的命名空间的最近公共(public)范围。这意味着在这种情况下 using namespace A;
使另一个 f
看起来好像是在全局范围内声明的,但它仍然被 B::f(int)
隐藏。
(ISO/IEC/BS 14882:2003 7.3.4 [namespace.udir]/1 适用于所有标准爱好者。)
关于c++ - 出色的 C++[Bug]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3039615/