C++ C++;使用关键字

C++ C++;使用关键字,c++,namespaces,using-declaration,C++,Namespaces,Using Declaration,使用关键字的这两种用法之间有什么区别: using boost::shared_ptr; 及 仅包括当前命名空间中boost命名空间中的shared_ptr。 这意味着您可以使用shared_ptr,而无需使用名称空间boost对其进行限定 使用声明将其称为 包括当前作用域中boost命名空间中的所有符号。 这意味着您可以使用boost名称空间中的所有符号,而无需使用名称空间boost对它们进行限定 使用指令将其称为 为什么您总是喜欢使用声明而不是使用指令? 最好使用第一个(使用声明),避

使用关键字的这两种用法之间有什么区别:

using boost::shared_ptr;

仅包括当前命名空间中
boost
命名空间中的
shared_ptr
。 这意味着您可以使用
shared_ptr
,而无需使用名称空间
boost
对其进行限定

使用声明将其称为


包括当前作用域中
boost
命名空间中的所有符号。 这意味着您可以使用
boost
名称空间中的所有符号,而无需使用名称空间
boost
对它们进行限定

使用指令将其称为


为什么您总是喜欢
使用声明
而不是
使用指令

最好使用第一个(
使用声明
),避免使用第二个(
使用指令
),因为第二个会导致名称空间污染,因为它可能会将大量名称引入当前名称空间,其中许多名称是不必要的。不必要名称的存在极大地增加了意外名称冲突的可能性

引用Herb Sutter关于使用指令的用法:


我觉得将指令
视为一支疯狂野蛮人的劫掠大军是很有帮助的,无论它经过哪里,它都会肆无忌惮地进行破坏——仅仅是它的存在就可能导致
意外冲突,
即使您认为自己与之结盟。

第一个仅允许您使用共享的名称,而不使用boost::前缀。第二种方法允许您使用boost命名空间中的任何和所有名称,而不使用boost::前缀。有些人不喜欢后者,但这从来没有给我带来任何问题。

  • 使用名称空间boost
    使
    boost
    名称空间中的所有名称在没有限定的情况下可见
  • 使用boost::shared_ptr
    只会使
    shared_ptr
    在没有限制的情况下可见
    • 第一个被称为

      第二个被称为

      引用MSDN:

      注意using指令和using指令之间的区别 声明:

      using声明允许使用单个名称 无条件使用

      using指令允许所有名称 在未经限定的名称空间中使用


      是的,这是必要的,因为它显著减少了名称空间污染。@DeadMG
      使用名称空间
      广泛用于标准库头文件中。在这种情况下,污染是故意的。@David:快速搜索gcc4.2中的stantard头发现,另一方面,只有
      debug/debug.h
      (这是一个实现细节)使用了
      使用namespace
      指令,<代码>使用声明使用超过1000次。@ ALS:答案是缺少一些细节,我觉得懒得去查找它们并检查标准,但是您可以考虑在一个类中实现一个成员函数:<代码>结构> x{int d;无效交换(x和其他){使用STD:::SWAP;SWAP;(d,other.d);}
正确,但用using指令替换using声明将无法编译。@David Heffernan:If by“不一定”我同意你的意思,你的意思是有时最好避免使用
使用
。另一方面,如果你的意思是有时
使用命名空间
是首选,我同意。
using namespace boost;
using boost::shared_ptr;
using namespace boost;