Ich bin verwirrt, warum der folgende Code in einigen Fällen kompiliert, aber nicht andere.Warum kann ich diese C++ - Standardbibliotheksfunktion ohne std :: qualifier aufrufen?
#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;
}
Ich habe in drei Fällen gegeben: CASE 0 schlägt fehl, da zu kompilieren es nicht so etwas wie „max_element“ ist. Ich repariere das in FALL 1, indem ich stattdessen zu "std :: max_element" ändere, und es tut kompiliert und funktioniert wie erwartet.
Interessanterweise für CASE 2 (technisch alles andere als 0 oder 1), kompiliert und funktioniert es auch. Aber CASE 2 hat das gleiche Problem wie CASE 0, also warum funktioniert es?
[Argument abhängige Suche] (http://en.cppreference.com/w/cpp/language/adl). – songyuanyao
@songyuanyao also hängt dieser Code von Implementierungsdetails von 'vector :: iterator' ab. Wenn es von Nicht-Klassen-Typ wäre, würde ADL –
fehlschlagen, wenn ich versuche, meine eigene Version von max_element mit dem gleichen Namen zu definieren und dann mit CASE 2 oben aufzurufen, beschwert sich der Compiler, dass "call to max_element" mehrdeutig ist, was Ich gehe davon aus, dass die argumentabhängige Suche den vorhandenen max_element-Konflikt mit dem Konflikt, den ich explizit definiert habe, in Konflikt bringt. Warum darf ich das nicht tun? Bedeutet dies, dass die argumentabhängige Suche meinen nicht-std-Namespace verschmutzt? – xdavidliu