有一种情况(诚然,有些不常见),您使用的表单确实可以产生影响,而您想要使用的表单是 using namespace foo
,并且它最常应用于std
命名空间(即,您编写using namespace std;
.
最明显的示例是您正在为用户定义的类型编写排序。这可能会应用于用户也定义了自己的类型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 库的大部分目的。