web-dev-qa-db-fra.com

Lambda d'un lambda: la fonction n'est pas capturée

Le programme suivant ne compile pas:

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
#include <cstdlib>
#include <cmath>

void asort(std::vector<double>& v, std::function<bool(double, double)> f)
{
    std::sort(v.begin(), v.end(), [](double a, double b){return f(std::abs(a), std::abs(b));});
}

int main()
{
    std::vector<double> v({1.2, -1.3, 4.5, 2.3, -10.2, -3.4});
    for (unsigned int i = 0; i < v.size(); ++i) {
        std::cout<<v[i]<<" ";
    }
    std::cout<<std::endl;
    asort(v, [](double a, double b){return a < b;});
    for (unsigned int i = 0; i < v.size(); ++i) {
        std::cout<<v[i]<<" ";
    }
    std::cout<<std::endl;
    return 0;
}

car :

error : 'f' is not captured

Qu'est-ce que cela signifie et comment résoudre le problème?

29
Vincent

Vous utilisez le paramètre f dans le lambda à l'intérieur de asort(), mais vous ne le capturez pas. Essayez d'ajouter f à la liste de capture (modifiez [] lire [&f]).

54
cdhowie

Vous référencez efficacement f, qui est une variable dans la portée externe, dans votre lambda. Vous devez le capturer dans votre liste de capture (le plus simple est probablement par référence [& f], ou [&] pour tout capturer par référence, car vous l'utilisez immédiatement).

Sur une autre note, std :: function a une surcharge car il effectue l'effacement de type, dans votre cas ici, il pourrait être préférable d'introduire un type de modèle.

8
wendazhou