using指示与作用域



今天又遇到一个小问题:using指示与作用域。
在QQ群里发了消息请教没人响应,跟同学讨论了几句也没啥结果。只能埋头重看!终于有点顿悟~

----------------------------------------华丽分割线----------------------------------------

《C++ Primer》
17.2.4. 命名空间成员的使用
using指示与作用域

A using directive does not declare local aliases for the namespace member names. Rather, it has the effect of lifting the namespace members into the nearest scope that contains both the namespace itself and the using directive.
using 指示不声明命名空间成员名字的别名,相反,它具有将命名空间成员提升到包含命名空间本身和 using 指示的最近作用域的效果。

----------------------------------------华丽分割线----------------------------------------

这里的一个词“effect”,中文译为“效果”。但是效果归效果,终究是假象,实际上不是那么回事!
后面的“using指示例子”小节,我觉得例子讲解部分说的还算清楚,但例子举得不是很好。在解释作用域提升(也就是上面的lift)的时候,它用的是“as if”,只是看起来像而已,也就是说这并不等价于在“最近作用域”声明了命名空间成员。

下面是自己写的几行测试代码:
 
在B中使用using指示引入A中的成员,但这些成员看起来好像是在全局作用域(也就是包括命名空间本身和using指示的最近作用域)中声明的。
B中的fn()函数使用i并不会产生歧义,虽然使用using指示引入了A中的i,但是那看起来就像是在全局作用域里声明的,B本身声明的i屏蔽了外围作用域(全局作用域)中相同的名字。所以fn()调用的是B中的i,打印2。


还有这里强调了“好像是”(as if),它并不等价于在全局作用域中声明,如果等价于在全局作用域声明了A中的成员,那么可以在全局作用域定义这样的函数:

实际上编译的时候给出的错误:i未声明。要访问命名空间A中的i,还是只能使用A::i访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值