В этот ответ Я использую этот код:
std::vector<std::vector<int>> imat(3, std::vector<int>(10));
std::for_each(imat.begin(), imat.end(), [&](auto& i) {
static auto row = 0;
auto column = 0;
std::transform(i.begin(), i.end(), i.begin(),
[&](const auto& /*j*/) {
return row * column++;
});
++row;
});
Но я замечаю некоторое неправильное поведение при захвате static auto row
в зависимости от компилятора.
0 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9
0 2 4 6 8 10 12 14 16 18
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
И Visual Studio 2015 дает мне ошибку времени компиляции:
В компиляторе произошла внутренняя ошибка.
Если я изменяю захват вложенного захвата на захват row
явно, я получаю ошибку компилятора:
идентификатор в захвате должен быть переменной с автоматическим временем хранения, объявленным в области охвата лямбда
Мне удалось захватить static
во вложенной лямбда? Это кажется законным, но есть так много проблем!
EDIT:
Фози отметил, что я могу заставить Visual Studio 2015 скомпилировать и дать тот же результат, что и Clang 3.7.0, если я изменю тип вложенного лямбда-параметра от const auto&
до const int&
. Который кажется совершенно не связанным, но он работает.
Это не работает, если я попытаюсь зафиксировать row
явно. В этом случае я все еще получаю ошибку компилятора:
идентификатор в захвате должен быть переменной с автоматическим временем хранения, объявленным в области охвата лямбда
Я сообщил об ошибке Visual Studio 2015 здесь: https://connect.microsoft.com/VisualStudio/feedback/details/1930409/capturing-a-lambdas-static-in-a-nested-lambda