STL 中的自由函数是否需要命名空间

Are name spaces required for free functions in the STL?

本文关键字:命名空间 是否 函数 自由 STL      更新时间:2023-10-16

我正在玩我的编码风格。 我曾经在每个库调用前面显式地加上 std:: 但我正在切换到使用这样的声明:

using std::count;
using std::vector;

在过去的几天里,我注意到的一件事是,有时如果我忘记了使用声明(using std::vector;是一个很好的例子),我会收到大量的编译器错误。 但是,如果我忽略了命名空间 delcare,则using std::count;我的代码编译得很好的算法。

这与类和自由函数的区别有关吗? 在所有参考站点上,count(first, last, value)vector 都以 std:: 为前缀,因此我希望它们的行为相同。

还是与全局命名空间中的其他函数有关? 我注意到std::max似乎还需要命名空间声明,也许它是在默认包含的 Apple/glibc/LLVM 文件中定义的,因此如果我使用它没有命名空间声明,就会发生冲突?

我在El Capitan上使用Apple LLVM 7.0.2。

编辑:向我们展示代码

#include <algorithm>
#include <vector>
using std::count;
using std::vector;
int main() {
    vector<int> v = { 1, 2, 3, 4 };
    return count(begin(v), end(v), 3);
}

正如T.C.(几乎)所说,魔法咒语是ADL,代表"依赖于参数的查找"。当使用类型在命名空间中定义的参数调用函数时,编译器会在同一命名空间中查找该函数。有道理,对吧?