有一个(当然,有些少见)情况,即你使用真正的形式可以有所作为,而且要使用形式为using namespace foo
,它的最普遍应用于std
命名空间(也就是说,你写using namespace std;
。
最明显的例子是,你写一个排序的用户定义类型,它是可能,这将被应用到该用户还定义了一个类型的拥有swap
。
如果用户想要使用swap,如果他们已经定义了swap,就会陷入困境,但如果他们没有定义,则使用std :: swap。如果您在代码中直接使用std::swap
,那么即使类型具有自己定义的交换,您也将最终使用std::swap
。相反,如果您直接为该类型指定一个交换,并且没有提供交换,则代码将无法编译。
要解决这个问题,你做这样的事情:
using namespace std;
template <class Iter>
void my_sort(Iter first, Iter last) {
// ...
if (*last < *first)
swap(*first, *last);
}
这将找到交换专门针对类型进行比较(即,在同一个命名空间作为类型定义的swap
),如果有一个(通过依赖于参数的查找)和std::swap
(如果没有为该类型定义)(通过using namespace std;
)。
这可能会对性能产生影响 - 如果他们专门为它们的类型编写了交换,那么通常可以预期这是因为通过这样做,它们可以提供更好的性能。这意味着明确指定std::swap
可能会起作用,但可能会导致性能下降。 (除了上面的情况,我在写代码的时候),我更喜欢给出全名(例如,std::swap
)至少有两种可能性可能是首选,我想给编译器足够的余地来选择正确的。
另一次我发现使用有用的声明/指令时,命名空间得到真正深层嵌套。 Boost(对于一个明显的例子)有一些名称,如果您每次使用完全限定的名称,那么这些名称会太方便使用。对于(现在感谢,主要是过时的)Boost Lambda库来说尤其如此,在这里你使用了像_1
这样的占位符,它最终会像boost::lambda::placeholders::_1
一样(但是我要从内存中去掉,所以这可能至少部分是错误的)如果你坚持使用完全合格的名字。这将首先破坏使用lambda库的大部分目的。
它与运行时性能无关。 –
我在大学时被告知,除了范围内的所有名称空间外,使用'using namespace std;'也是一个安全隐患。 –
1.因为你描述的原因而气馁2.帮助你在ADL的帮助下使用他人提供的函数(参见'std :: swap',尽管让答案更好地向你解释这一点)3。我最喜欢的,但这是一个味道的问题,如果你不喜欢在所有地方看到“std ::”,那么可能会很麻烦。但他们都没有任何性能差异,它们只是名称解析,并没有*“编译成实际的代码”*。 –