为什么在某些情况下不需要"std::"?

Why do I not need "std::" in some scenarios?

本文关键字:std 不需要 情况下 为什么      更新时间:2023-10-16

为什么要起作用:

#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,如果是,为什么?

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

与参数有关的查找,也称为ADL或Koenig查找,是在函数call表达式中查找无限制函数名称的规则集,包括对超载运算符的隐式函数调用。这些函数名称还在其参数的名称空间中查找,除了通常的无限制名称查找的范围和名称空间。

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

在第二个示例中,这是不可能的,因为对min_element的参数仅是数组nums address 。因此,您必须专门使用std::,以便查找资格。

相关文章: