Qu'est-ce qui disqualifie la capture de lambda d'être passé à la méthode apply
de std::valarray
? considérer le code suivant:Pourquoi le lambda de capture ne peut-il être appliqué à std :: valarray?
int main()
{
std::valarray<int> arr = {1, 2, 3, 4, 5, 6};
auto arr1 = arr.apply([](int val) { return val * 2; }); // compiles
int n = 3;
auto arr2 = arr.apply([n](int val) { return val * n; }); //does not compile
return 0;
}
en direct sur coliru http://coliru.stacked-crooked.com/a/f0407046699574fc
Testé sur https://gcc.godbolt.org/
Ni GCC, ni MSVC ou Clang compilerait le code ci-dessus
une idée de pourquoi cela a été fait en premier lieu? peut-être parce que cela rendrait les optimisations de vectorisation ou de parallélisation non applicables sur une telle implémentation 'apply'? – kreuzerkrieg
@kreuzerkrieg - 'std :: valarray' a été conçu longtemps avant que lambdas ne soit introduit dans la langue. Aussi, j'imagine que c'est encourager les fonctions "pures". En C++ moderne, cela se démarque, je sais. – StoryTeller
ummm ... ils ont ajouté des spécialisations std :: begin/fin pour C++ 11 pour valarrays, pourquoi ne pas ajouter le reste des trucs modernes ... Eh bien, je suppose que le valarray n'est pas aussi largement utilisé que le reste de Conteneurs STL. – kreuzerkrieg