我一直在阅读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()?
}
}
这个 f() 调用自身,无限递归。原因是唯一可见的 f() 是 B::f() 本身。
还有另一个带有签名 f(int) 的函数,即命名空间 A 中的函数。如果 B 写了“使用命名空间 A;”或“using A::f;”,那么在查找 f(int) 时 A::f(int) 将作为候选者可见,并且 f(i) 调用在 A::f( int) 和 B::f(int)。然而,由于 B 没有将 A::f(int) 纳入作用域,因此只能考虑 B::f(int),因此调用明确解析为 B::f(int)。
但是当我执行以下操作时..
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 定义使命名空间的成员在使用它的范围内可见,但它们appear就好像该名称来自引入的命名空间和使用 using 指令的命名空间的最近公共范围。这意味着using namespace A;
在这种情况下,使另一个f
看起来好像它是在全局范围内声明的,但它仍然被隐藏B::f(int)
.
(ISO/IEC/BS 14882:2003 7.3.4 [namespace.udir] / 1 适用于所有标准爱好者。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)