Я в замешательстве, почему следующий код компилируется в некоторых случаях, но не в других.Почему я могу вызвать эту стандартную библиотечную функцию C++ без std :: qualifier?
#include <iostream>
#include <vector>
#include <algorithm>
int main(){
std::vector<int> v(3);
int a[] = {3, 6, 2};
std::copy(a, a+3, v.begin());
#define CASE 2
#if CASE == 0
std::cout << *max_element(a, a+3) << "\n";
#elif CASE == 1
std::cout << *std::max_element(a, a+3) << "\n";
#else
std::cout << *max_element(v.begin(), v.end()) << "\n";
#endif
return 0;
}
Я поместил в трех случаях: СЛУЧАЙ 0 не удается собрать, потому что нет такого понятия, как «max_element». Я исправлю это в CASE 1, заменив вместо него «std :: max_element», и он делает компилируется и работает как ожидалось.
Однако, интересно для CASE 2 (технически ничего, кроме 0 или 1), он также компилируется и работает. Но CASE 2 имеет ту же проблему, что и CASE 0, так почему она работает?
[Аргумент-зависимый поиск] (http://en.cppreference.com/w/cpp/language/adl). – songyuanyao
@songyuanyao, поэтому этот код зависит от деталей реализации 'vector :: iterator'. Если бы это был тип non-class, тогда ADL завершил бы ошибку –
, если я попытаюсь определить мою собственную версию max_element с тем же именем, а затем вызывая ее с использованием CASE 2 выше, компилятор жалуется, что «вызов max_element» неоднозначен, что Я предполагаю, что зависящий от аргументов поиск делает существующий конфликт max_element с тем, который я явно определил. Почему мне не разрешают это делать? Означает ли это, что зависящий от аргументов поиск загрязняет мое пространство имен, отличное от std? – xdavidliu