ventajas tutorial son sintaxis que operador funciones expresiones español aprender c++ c++11 lambda std-function

c++ - tutorial - operador lambda python



Lambda de un lambda: la función no se captura. (2)

El siguiente programa no compila:

#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; }

porque :

error : ''f'' is not captured

¿Qué significa y cómo resolver el problema?


En efecto, está haciendo referencia a f, que es una variable en el ámbito externo, en su lambda. Debe capturarlo en su lista de capturas (lo más simple es probablemente por referencia [& f], o [&] para capturar todo por referencia, ya que lo está usando de inmediato).

En otra nota, la función std :: tiene algo de sobrecarga al realizar el borrado de tipo, en su caso aquí podría ser mejor introducir un tipo de plantilla.


Utiliza el parámetro f en la lambda dentro de asort() , pero no lo captura. Intente agregar f a la lista de captura (cambie [] para leer [&f] ).