Почему мне не нужен "std ::" в некоторых сценариях? - PullRequest
0 голосов
/ 14 февраля 2019

Почему это работает:

#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 голосов
/ 14 февраля 2019

В первом примере используется ADL и найдено min_element.В этом примере аргументы min_element являются итераторами (nums.begin(), nums.end()).

Поиск, зависящий от аргументов, также известный как ADL, или поиск Кенига, представляет собой набор правил для поиска неквалифицированных имен функций в выражениях вызова функций, включая неявные вызовы функций перегруженных операторов. Эти имена функций ищутся в пространствах имен их аргументов в дополнение к областям и пространствам имен, которые рассматриваются при обычном поиске безоговорочного имени.

В используемой реализации,итераторы begin() и end() из vector реализованы таким образом, что это возможно.

Во втором примере это невозможно, поскольку аргументы min_element просто адресов массива nums.Таким образом, вы должны специально использовать std::, чтобы поиск был квалифицирован.

...