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::vector
i std::array
; i który kompilator jest poprawny?
std::sort
która prowadzi do wyszukiwania zależnego od argumentów (tak jak już masz dla std::begin
i std::end
)?
namespace std
nawet 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.