C ++:类和函数的名称空间说明符

时间:2013-02-23 21:03:42

标签: c++ namespaces

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

4 个答案:

答案 0 :(得分:4)

  

为什么使用vector类我应该写命名空间说明符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()限定调用std::。 1}}。例如:

#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;
}

显然,这不适用于接受 no 参数的函数。在这种情况下,命名空间限定总是必要的,除非当然调用点在该命名空间内(尽管你不能向<{1}}命名空间添加任何东西,但是一些模板来自std命名空间可以是专门的。)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

一开始你将librairie包含在你的程序中(std命名空间) 那么你不需要一直使用std这个词 但实际上所有对象都像std :: cout std :: cin

std是c ++的基础库之一

因为我的英语需要更正;)

答案 3 :(得分:0)

由于某种原因,STL选择在全局命名空间中公开许多算法(in)。这就是你可以写find(...)或转换(...)的原因。矢量未公开,因此您必须std::vector<>()。或者您可以将std::vector;放在文件顶部