考虑这个库标题:
#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 :
这可以与其中任何一个结合,但编辑会很严重。
答案 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中如何运作。