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

问题描述 投票:3回答:1

为什么这样做:

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

c++ vector namespaces
1个回答
3
投票

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

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

在你正在使用的实现中,begin()的迭代器end()vector以这样的方式实现,这是可能的。

在第二个例子中,这是不可能的,因为min_element的参数只是数组nums的地址。因此,您必须专门使用std::,以便查找符合条件。

© www.soinside.com 2019 - 2024. All rights reserved.