可能重复:
使用 std 命名空间
我只是想知道是否有理由在某些操作中包含 std:: ,例如 std::sort() 。是因为可能超载吗?
除了通常众所周知的用不必要的符号名称和可读性污染当前名称空间的原因之外,还有另一个微妙的原因。
考虑std::swap的示例,它是交换两个值的标准库算法。对于Koenig 算法/ADL,在使用此算法时必须谨慎,因为:
std::swap(obj1,obj2);
可能不会显示与以下相同的行为:
using std::swap;
swap(obj1, obj2);
使用 ADL,swap
调用哪个版本的函数将取决于传递给它的参数的名称空间。
如果存在命名空间A
并且 if A::obj1
, A::obj2
&A::swap()
存在,那么第二个示例将导致调用A::swap()
可能不是用户想要的。
此外,如果由于某种原因:
A::swap(A::MyClass&, A::MyClass&)
和std::swap(A::MyClass&, A::MyClass&)
都被定义,那么第一个示例将调用std::swap(A::MyClass&, A::MyClass&)
,但第二个示例将不会编译,因为swap(obj1, obj2)
它是模棱两可的。