0

为什么使用向量类我应该写命名空间说明符std::vectorstd::find我可以省略函数std::?有什么不同?两者都在std命名空间中定义,对吧?

4

4 回答 4

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可以被专门化)。

于 2013-02-23T21:08:37.620 回答
1

一开始,您将库包含到您的程序中(std 命名空间),然后您就不需要一直使用 std 这个词了。但实际上所有对象都等于 std::cout std::cin

std 是 c++ 的基本库之一

于 2013-02-23T21:08:29.247 回答
1

这取决于您如何调用std::find...例如,如果您从 std 容器传递一些迭代器,则此函数将由ADL找到,否则您必须添加std::才能调用它。

于 2013-02-23T21:09:09.463 回答
0

出于某种原因,STL 选择在全局名称空间中公开许多算法(在 中)。这就是为什么你可以只写 find(...) 或 transform(...)。向量没有暴露,所以你必须要么做std::vector<>()。或者您可以将 usingstd::vector;放在文件顶部

于 2013-02-23T21:16:19.483 回答