Просто из любопытства я нашел довольно странное исключение, что вы можете использовать функцию lower_bound
, не сообщая, в каком пространстве имен она находится. Следующий код:
// main.cpp
#include <algorithm>
#include <cstdio>
#include <vector>
// The std prefix is required for the vector, but not for the lower_bound, why?
using std::vector;
int main() {
vector<int> v = {0,1,2,3,4,5};
int index = lower_bound(v.begin(), v.end(), 2) - v.begin();
// prints 2, as expected.
printf("%d\n", index);
return 0;
}
компилируется командой g++ main.cpp
, компилятором g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
.
Вопрос: принадлежит ли lower_bound
какому-либо пространству имен? Если нет, то какова мотивация такого дизайна?
@Mankarse Имеет смысл, мог бы принять такой ответ.
Отвечает ли это на ваш вопрос? Что такое «Поиск, зависящий от аргумента» (также известный как ADL или «Поиск Кенига»)?
Обратите внимание, что std::vector::iterator
не является обязательной частью std
, может быть int*
, поэтому std::
должен быть обязательным.
@RichardCritten да, это так.
lower_bound()
действительно находится в пространстве имен std
, как и ожидалось. Причина, по которой вы можете вызывать его без указания префикса std::
, заключается в поиске, зависящем от аргумента. Вы передаете std::vector
итераторы в lower_bound()
, и эти типы итераторов находятся в пространстве имен std
в реализации std::vector
вашего компилятора. Таким образом, компилятор ищет неполную функцию lower_bound()
КАК в глобальном пространстве имен, так и в пространстве имен std
, находя последнее.