Primer第三版中对于using指示符有以下阐述:
“using 指示符使名字空间成员名可见,就好像它们是在名字空间被定义的地方之外被声明的一样。using 指示符并没有为名字空间成员的名字声明局部的别名,而是把名字空间的成员转移到包含该名字空间定义的那个域中。”
这句话写得有些晦涩。先看一个例子:
namespace
A
{
int i = 20 ;
namespace B
{
int i = 10 ;
}
}
int main()
{
using namespace A::B;
i= 30 ;
}
{
int i = 20 ;
namespace B
{
int i = 10 ;
}
}
int main()
{
using namespace A::B;
i= 30 ;
}
按照上述说法,在using namespace A::B后,B中的i 就好像是在A中声明的一样,因此与A中的i重复定义,编译器应该报错,但事实上,上述代码没有问题,这是怎么回事呢?
A不是定义在main()函数的局部域中,在main的局部域中using namespace A::B,A的定义不可见,所以再向外一层,到了全局域,而全局域包含A的定义,因此最终,B中的i 就好像是在全局域中声明的一样。
下面的代码验证上面的推测:
#include
<
iostream
>
using namespace std;
namespace A
{
int i = 20 ;
namespace B
{
int i = 10 ;
}
void foo()
{
using namespace A::B;
cout << i << endl;
}
}
int main()
{
A::foo();
}
using namespace std;
namespace A
{
int i = 20 ;
namespace B
{
int i = 10 ;
}
void foo()
{
using namespace A::B;
cout << i << endl;
}
}
int main()
{
A::foo();
}
此时,using namespace A::B 时,是在A内,A的定义可见,因此,B中的i 就好像是在A中声明的一样。此时,不出所料,编译器报错,i的使用歧义。
test.cpp:15: error: use of `i' is ambiguous
test.cpp:6: error: first declared as `int A::i' here
test.cpp:9: error: also declared as `int A::B::i' here