Usar la variable miembro en la lista de captura lambda dentro de una función miembro

El siguiente código se comstack con gcc 4.5.1 pero no con VS2010 SP1:

#include  #include  #include  #include  #include  #include  using namespace std; class puzzle { vector<vector> grid; map<int,set> groups; public: int member_function(); }; int puzzle::member_function() { int i; for_each(groups.cbegin(),groups.cend(),[grid,&i](pair<int,set> group){ i++; cout<<i<<endl; }); } int main() { return 0; } 

Este es el error:

 error C3480: 'puzzle::grid': a lambda capture variable must be from an enclosing function scope warning C4573: the usage of 'puzzle::grid' requires the compiler to capture 'this' but the current default capture mode does not allow it 

Asi que,

1> qué comstackdor tiene razón?

2> ¿Cómo puedo usar las variables de miembro dentro de una lambda en VS2010?

Creo que VS2010 está bien esta vez, y verificaría si tuviera el estándar a mano, pero actualmente no.

Ahora, es exactamente como dice el mensaje de error: No puede capturar cosas fuera del scope adjunto de la lambda. † la grid no está en el scope adjunto, pero this es (cada acceso a la grid sucede realmente como this->grid en las funciones miembro). Para su caso de uso, capturar this funciona, ya que lo usará de inmediato y no quiere copiar la grid

 auto lambda = [this](){ std::cout << grid[0][0] << "\n"; } 

Sin embargo, si desea almacenar la cuadrícula y copiarla para un acceso posterior, donde el objeto de su puzzle ya podría estar destruido, tendrá que hacer una copia local e intermedia:

 vector > tmp(grid); auto lambda = [tmp](){}; // capture the local copy per copy 

† Estoy simplificando - Google para "alcanzar scope" o ver §5.1.2 para todos los detalles sangrientos.

Resumen de las alternativas:

captura this

 auto lambda = [this](){}; 

use una referencia local al miembro:

 auto& tmp = grid; auto lambda = [ tmp](){}; // capture grid by (a single) copy auto lambda = [&tmp](){}; // capture grid by ref 

C ++ 14:

 auto lambda = [ grid = grid](){}; // capture grid by copy auto lambda = [&grid = grid](){}; // capture grid by ref 

ejemplo: https://godbolt.org/g/dEKVGD

Creo que debes capturar this .

Un método alternativo que limita el scope de la lambda en lugar de darle acceso al todo this es pasar una referencia local a la variable miembro, por ejemplo

 auto& localGrid = grid; int i; for_each(groups.cbegin(),groups.cend(),[localGrid,&i](pair> group){ i++; cout<