Lorsque vous faites appel std::sort()
à 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));
}
Gcc et clang renvoient tous deux une erreur sur le tri sur std::array
- clang dit
erreur: utilisation de l'identifiant non déclaré «tri»; vouliez-vous dire 'std :: sort'?
Changer pour std::sort(begin(foo2), end(foo2))
résoudre le problème.
MSVC compile le code ci-dessus tel qu'il est écrit.
Pourquoi la différence de traitement entre std::vector
et std::array
; et quel compilateur est correct?
std::sort
qui mène à une recherche dépendante des arguments (comme vous l'avez déjà pour std::begin
et std::end
)?
namespace std
même là où un type de pointeur simple aurait fonctionné. Je crois que cela consiste à insérer des vérifications de build de débogage pour détecter les dépassements et autres erreurs courantes.
sort(...
->std::sort(...
. Je suppose que l'ADL (recherche dépendante de l'argument) est ce qui vous fait trébucher. Ça, ou des guides de déduction. Dans tout les cas; qualifiez toujours les fonctions que vous appelez.