使用std :: <type> vs使用std命名空间

这个问题在这里已经有了答案:

  • 为什么“使用名称空间标准”被认为是不好的做法? 35个答案

  • 这取决于。

    如果你想注入一个单一的名称到另一个范围,使用声明更好,例如

    namespace foolib
    {
      // allow vector to be used unqualified within foo,
      // or used as foo::vector
      using std::vector;
    
      vector<int> vec();
    
      template<typename T> struct Bar { T t; };
    
      template<typename T>
      void swap(Bar<T>& lhs, Bar<T>& rhs)
      {
        using std::swap;
        // find swap by ADL, otherwise use std::swap
        swap(lhs.t, rhs.t);
      }
    }
    

    但有时你只是想要所有的名字,这是一个使用指令所做的。 这可以在函数中本地使用,也可以在源文件中全局使用。

    在函数体外部using namespace应该只在确切知道包含什么内容的情况下才能完成,因为它是安全的(即不在头部,不知道头部之前或之后将包含什么),尽管许多人仍然皱眉头在这种用法(阅读答案为什么是“使用命名空间标准”被认为是不好的做法?详情):

    #include <vector>
    #include <iostream>
    #include "foolib.h"
    using namespace foo;  // only AFTER all headers
    
    Bar<int> b;
    

    使用using指令的一个很好的理由是,名称空间只包含少量名称,这些名称被有意分离,并且被设计为使用using指令:

    #include <string>
    // make user-defined literals usable without qualification,
    // without bringing in everything else in namespace std.
    using namespace std::string_literals;
    auto s = "Hello, world!"s;
    

    所以没有一个答案可以说一个人普遍比另一个更好,他们有不同的用途,而且在不同的背景下各有所长。

    关于using namespace的第一个用法,C ++的创建者Bjarne Stroustrup在C ++编程语言第4版§14.2.3(重点介绍)中有这样的说法:

    我们通常喜欢使用名字空间中的每个名字而没有限定。 这可以通过为名称空间中的每个名称提供using声明来实现,但这很乏味,并且每次向名称空间添加新名称或从中删除新名称时都需要额外的工作。 或者,我们可以使用一个using -directive要求,从命名空间的名称均是在我们没有资格范围访问。 [...]
    [...]使用using -directive从常用和知名的库中提取名称using不受限制地使用,这是一种简化代码的流行技术。 这是本书中用于访问标准库设施的技术。 [...]
    在一个函数中, using -directive可以安全地用作符号方便,但应该注意全局using -directives,因为过度使用可能会导致命名空间被引入的名称冲突。 [...]
    因此,我们必须谨慎using全球范围内的指挥。 特别是,除非在非常特殊的情况下(例如,为了帮助转换),否则不要在头文件中的全局范围中using -directive,因为您永远不知道标头可能在哪里#include d。

    对我来说,这似乎比只坚持它不好,不应该使用更好的建议。


    using std::string;using std::vector;

    用一堆符号污染全局命名空间是一个坏主意。 你应该只使用std命名空间前缀,这样你就知道你正在使用标准库容器。 哪一个比IMO这两个选项都好。

    如果你只是简单地使用标准库而没有其他的东西,并且永远不会将任何其他库添加到你的项目中,那么一定要using namespace std; - 无论你在那种情况下感觉更舒适。 “永远不使用using namespace std; ”的惯例来自多个其他库定义诸如stringvector等事物的事实。 永远不要导入整个名称空间是一个好习惯,但它不会引起你的情况。

    链接地址: http://www.djcxy.com/p/5053.html

    上一篇: using std::<type> v.s. using std namespace

    下一篇: Does C++11 change the behavior of explicitly calling std::swap to ensure ADL