详细命名空间中的using指令是否有问题?

时间:2017-09-12 04:56:10

标签: c++ namespaces using-directives

考虑这个库标题:

#include<vector>
#include<algorithm>
#include<iostream>

namespace Lib {
  namespace detail {
    using namespace std;

    template<class T>
    void sort_impl(istream &in,ostream &out) {
      vector<T> v;
      {
        int n;
        in >> n;
        v.resize(n);
      }
      for(auto &i : v) cin >> i;

      sort(v.begin(),v.end());
      for(auto i : v) out << i << endl;
    }
  }

  inline void sort_std() {
    detail::sort_impl<int>(std::cin,std::cout);
  }
}

在此示例中,detail命名空间是否成功地将库的客户端(以及库的其余部分实现)与 using-directive 隔离开来?我对Why is "using namespace std" considered bad practice?的讨论不感兴趣,尽管有些论据甚至适用于&#34;包含良好的&#34; using指令

请注意,有两个关于相同情况的现有问题,但使用 using-declarations

这可以与其中任何一个结合,但编辑会很严重。

2 个答案:

答案 0 :(得分:6)

您污染了自己的detail namesapce,但没有污染Lib或全局命名空间。因此,假设一个负责任的成年人正在使用你的图书馆,他们就不会有无意的名字冲突:

#include <vector>

namespace Lib {
  namespace detail {
    using namespace std;
  }
}

using namespace Lib;

int main() {
    vector<int> v; // This is an error, vector not declared in this scope
}

答案 1 :(得分:3)

detail命名空间不会将客户端与嵌套的using指令隔离开来。 [namespace.udir]对此非常明确

  

using-directive指定指定命名空间中的名称可以在using-directive之后显示using-directive的范围内使用。在unqualified name lookup期间,名称看起来好像是在最近的封闭命名空间中声明的,其中包含using-directive和指定的命名空间。 [注意:在此上下文中,“包含”表示“直接或间接包含”。 - 结束记录]

一个小例子

#include <iostream>

namespace foo {
    namespace detail {
        using namespace std;
    }
}

int main()
{
    foo::detail::cout << "Hello World!\n";

    // nothing is stopping me from doing that
    using namespace foo::detail;
    cout << "Hello World!\n";
}

STL很好地解释了名称查找在他的视频Core C++, 1 of n中如何运作。