Я полагаю, что VS2010 на этот раз прав, и я бы проверил, был ли у меня под рукой стандарт, но в настоящее время я не могу.
Теперь, точно так же, как в сообщении об ошибке говорится: «Вы можете»• захватывать вещи вне области охвата лямбды. † grid
не входит в область охвата, но this
есть (каждый доступ к grid
фактически происходит как this->grid
в функциях-членах).Для вашего варианта использования захват this
работает, так как вы будете использовать его сразу и не хотите копировать grid
auto lambda = [this](){ std::cout << grid[0][0] << "\n"; }
Если, однако, вы хотите сохранить сетку и скопироватьэто для последующего доступа, где ваш puzzle
объект может быть уже уничтожен, вам нужно будет сделать промежуточную локальную копию:
vector<vector<int> > tmp(grid);
auto lambda = [tmp](){}; // capture the local copy per copy
† Я упрощаю - Google для "достиженияобласть "или см. §5.1.2 для всех кровавых деталей.