为什么使用向量类我应该写命名空间说明符std::vector
但std::find
我可以省略函数std::
?有什么不同?两者都在std
命名空间中定义,对吧?
4 回答
为什么使用向量类我应该写命名空间说明符 std::vector 但对于 std::find 函数我可以省略 std:: ?
一般来说,这是不正确的。
有什么不同。两者都在 std 命名空间中定义,对吧?
是的,原则上没有区别。根据 C++11 标准的第 17.6.1.1/2 段:
除了宏、operator new 和 operator delete 之外的所有库实体都定义在命名
std
空间内或嵌套在命名空间内的命名空间内std
。[...]
但是,您必须记住,Argument-Dependent Lookup规则允许异常:由于这种查找技术,没有必要显式指定函数的命名空间,因为名称将在命名空间中查找您提供给该函数的参数。
因此,如果函数恰好与它的任何参数定义在同一个命名空间中,即使它的名称不符合它所属的命名空间,编译器也会找到它:
namespace N
{
struct X { };
void foo(X) { }
}
int main()
{
N::X x;
foo(x); // OK
}
因此,如果您使用命名空间std::find()
中定义的类型实例的某些参数进行调用,std
则无需限定对find()
with的调用std::
。例如:
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
std::vector<int> v { 1, 2, 3 };
auto i = find(v.begin(), v.end(), 2); // ADL applies if the result of
// v.begin() and v.end() is an
// iterator whose type is defined
// in the std namespace!
std::cout << *i;
}
显然,这不适用于不接受任何参数的函数。在这种情况下,命名空间限定始终是必要的,除非调用点在该命名空间内(尽管您不能向命名空间添加任何内容,但std
命名空间中的一些模板std
可以被专门化)。
一开始,您将库包含到您的程序中(std 命名空间),然后您就不需要一直使用 std 这个词了。但实际上所有对象都等于 std::cout std::cin
std 是 c++ 的基本库之一
这取决于您如何调用std::find
...例如,如果您从 std 容器传递一些迭代器,则此函数将由ADL找到,否则您必须添加std::
才能调用它。
出于某种原因,STL 选择在全局名称空间中公开许多算法(在 中)。这就是为什么你可以只写 find(...) 或 transform(...)。向量没有暴露,所以你必须要么做std::vector<>()
。或者您可以将 usingstd::vector;
放在文件顶部