Por ejemplo:Regla para la variable de captura lambda
class Example
{
public:
explicit Example(int n) : num(n) {}
void addAndPrint(vector<int>& v) const
{
for_each(v.begin(), v.end(), [num](int n) { cout << num + n << " "; });
}
private:
int num;
};
int main()
{
vector<int> v = { 0, 1, 2, 3, 4 };
Example ex(1);
ex.addAndPrint(v);
return 0;
}
Al compilar y ejecutar esto en MSVC2010 se obtiene el siguiente error:
C3480 de error: 'Ejemplo :: num': una captura de lambda variable debe ser de un ámbito de la función de cerramiento
Sin embargo, con g ++ 4.6.2 (preliminar) se obtiene:
¿Qué compilador está de acuerdo con el borrador estándar? dice
Tenga en cuenta que tiene que capturar 'this' por valor aquí, no' num'. Cuando usas 'num', realmente estás usando' this-> num'. También tenga en cuenta que MSVC no implementa la redacción de C++ 11 de lambdas, ya que cambió después de 2008 cuando implementaron todo esto. –
@Alexandre: Capturar 'this' es efectivamente lo mismo que capturar' num' por referencia. Eso parece no ser lo que se desea aquí. –
@Ben: buen punto. Sin embargo, el resultado es el mismo aquí, ya que el cierre no escapa al alcance de 'addAndPrint' (y, de todos modos, es probable que todo esto quede incluido aquí). 5.1.2 citado por @dimitri parece indicar que MSVC tiene razón, ya que 'num' no es una variable con duración de almacenamiento automática. Sin embargo, este comportamiento es bastante extraño. –