В this answer я использую этот код:захватывая Lambda статику в Вложенные лямбда
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 дает мне компиляции ошибки времени:
An internal error has occurred in the compiler.
Если изменить захват вложенной захвата для захвата row
я явно получаю ошибку компилятора:
identifier in capture must be a variable with automatic storage duration declared in the reaching scope of the lambda
Я позволил захватить static
во вложенной лямбда? Это кажется законным, но есть так много проблем!
EDIT:
Fozi pointed out что я может получить Visual Studio 2015 для компиляции и дают тот же результат, как Clang 3.7.0, если я изменить тип параметра вложенной Lambda от const auto&
к const int&
. Который кажется совершенно не связанным, но он работает.
Это не работает, если я попытаюсь зафиксировать row
явно. В этом случае я все еще получаю ошибку компиляции:
identifier in capture must be a variable with automatic storage duration declared in the reaching scope of the lambda
Я сообщил в Visual Studio 2015 ошибка здесь: https://connect.microsoft.com/VisualStudio/feedback/details/1930409/capturing-a-lambdas-static-in-a-nested-lambda
@ 865719 Хммм, я не могу найти решение, о котором вы говорите, но я обновлю свою Visual Studio 2015 и повторю попытку. –
@ 865719 Моя Visual Studio 2015 обновлена в соответствии с Windows Update. Кстати, я также могу реплицировать ошибку, вставив код в: http://webcompiler.cloudapp.net/ –
Он компилируется, если вы меняете 'const auto &/* j * /' на 'const int &/* j */' – Fozi