Dzwoniąc std::sort()na std::array:
#include <vector>
#include <array>
#include <algorithm>
int main() {
std::vector<int> foo{4, 1, 2, 3};
sort(begin(foo), end(foo));
std::array<int, 4> foo2{4, 1, 2, 3};
sort(begin(foo2), end(foo2));
}
Zarówno gcc, jak i clang zwracają błąd podczas sortowania w opcji std::array- mówi clang
błąd: użycie niezadeklarowanego identyfikatora „sort”; miałeś na myśli „std :: sort”?
Zmiana na std::sort(begin(foo2), end(foo2))naprawia problem.
MSVC kompiluje powyższy kod zgodnie z opisem.
Dlaczego różnica w traktowaniu między std::vectori std::array; i który kompilator jest poprawny?
std::sortktóra prowadzi do wyszukiwania zależnego od argumentów (tak jak już masz dla std::begini std::end)?
namespace stdnawet tam, gdzie działałby prosty typ wskaźnika. Uważam, że ma to na celu wstawienie kontroli kompilacji debugowania w celu wykrycia przekroczeń i innych typowych błędów.
sort(...->std::sort(.... Wydaje mi się, że to ADL (wyszukiwanie zależne od argumentów) jest tym, co cię potyka. To lub przewodniki dedukcyjne. W każdym przypadku; zawsze określ funkcje, które wywołujesz.