H!Techer

All Ideas One Ideal

using指示符

Primer第三版中对于using指示符有以下阐述:

“using 指示符使名字空间成员名可见,就好像它们是在名字空间被定义的地方之外被声明的一样。using 指示符并没有为名字空间成员的名字声明局部的别名,而是把名字空间的成员转移到包含该名字空间定义的那个域中。”

这句话写得有些晦涩。先看一个例子:

namespace A
{
    
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 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

阅读更多
文章标签: 编译器 bi
个人分类: Detailed C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭