“使用 T::member” 和 “using T::member” 有什么区别?和“使用命名空间”?
using
关键字的这两种用法有什么区别:
using boost::shared_ptr;
和
using namespace boost;
What is the difference between these two usage of using
keyword:
using boost::shared_ptr;
and
using namespace boost;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
仅包含当前命名空间中
boost
命名空间中的shared_ptr
。这意味着您可以使用
shared_ptr
,而无需使用命名空间boost
对其进行限定。它称为using 声明。
包含当前范围内
boost
命名空间中的所有符号。这意味着您可以使用
boost
命名空间中的所有符号,而无需使用命名空间boost
限定它们。它被称为using 指令。
为什么你总是更喜欢
using 声明
而不是using 指令
?使用第一个(
using 声明
)并避免第二个(using 指令
),因为第二个通过将潜在的大量名称引入当前命名空间而导致命名空间污染,其中许多是不必要的。不必要名称的存在大大增加了意外名称冲突的可能性。引用
Herb Sutter
关于using 指令
的用法:我发现将
using 指令
视为由疯狂的野蛮人组成的掠夺大军,所到之处都会肆意破坏——只要它的存在就可能导致意想不到的冲突
,即使你认为自己与它结盟。Includes only the
shared_ptr
from theboost
namespace in your current namespace.This means you can use the
shared_ptr
without qualifying it with namespaceboost
.It is called a using declaration.
Includes all the symbols in the
boost
namespace in your current scope.This means you can use all the symbols in the
boost
namespace without qualifying them with namespaceboost
.It is called as using directive.
Why should you always prefer
using declaration
overusing directive
?It is always better to use the first(
using declaration
) and avoid the second(using directive
) because the second causes namespace pollution by bringing in potentially huge numbers of names in to the current namespace, many of which are unnecessary. The presence of the unnecessary names greatly increases the possibility of unintended name conflicts.To quote
Herb Sutter
on the usage ofusing directive
:I find it helpful to think of a
using directive
as a marauding army of crazed barbarians that sows indiscriminate destruction wherever it passes--something that by its mere presence can causeunintended conflicts,
even when you think you're allied with it.using namespace boost
使boost
命名空间中的所有名称无需限定即可可见using boost::shared_ptr
只是使shared_ptr
可见无资格。using namespace boost
makes all names in theboost
namespace visible without qualificationusing boost::shared_ptr
just makesshared_ptr
visible without qualification.第一个称为
使用声明< /代码>
;
第二个称为
using 指令< /代码>
。
引用MSDN:
The first is called
using declaration
;The second is called
using directive
.Quoting MSDN:
第一个只允许您使用名称shared_ptr,而不带boost::前缀。第二个允许您使用 boost 命名空间中的任何和所有名称,而不带 boost:: 前缀。有些人不赞成后者,但它从来没有给我带来任何问题。
The first only allows you to use the name shared_ptr without the boost:: prefix. The second allows you to use any and all names in the boost namespace withoout the boost:: prefix. Some people frown on the latter but it's never given me any problems.