为什么在某些情况下我不需要“ std ::”?

时间:2019-02-14 04:45:08

标签: c++ vector namespaces

为什么这样做:

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
  std::vector<int> nums = {3, 7, 5};
  std::cout << *min_element(nums.begin(), nums.end()) << "\n";
}

但这不是:

#include <algorithm>
#include <iostream>

int main() {
  int nums[] = {3, 7, 5};
  std::cout << *min_element(nums, nums + 3) << "\n";
}

我发现,如果在第二个示例中将调用更改为min_element,因此它包含一个类似std::min_element的名称空间,则可以正常工作。我不明白的是为什么在第一个示例中不需要这样做。 vector是否以某种方式神奇地知道在哪里可以找到min_element,如果可以,为什么?

1 个答案:

答案 0 :(得分:3)

在第一个示例中,使用ADL并找到min_element。在此示例中,min_element的参数是迭代器(nums.begin(), nums.end())。

  

依赖于参数的查找(也称为ADL或Koenig查找)是用于在函数调用表达式中查找不合格函数名称的规则集,包括对重载运算符的隐式函数调用。 除了通常的非限定名称查找所考虑的范围和名称空间之外,还在其参数的名称空间中查找这些函数名称。

在您使用的实现中,begin()的迭代器end()vector以可能的方式实现。

在第二个示例中,这是不可能的,因为min_element的参数只是数组nums地址。因此,您必须专门使用std::才能使查询合格。