In 这个答案 https://stackoverflow.com/a/33282441/2642059我使用这段代码:
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
取决于编译器。
Clang 3.7.0 产量 http://coliru.stacked-crooked.com/a/fe3ef266452f39fe:
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
gcc 5.1.0 产量 http://ideone.com/NTLmV2:
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
我明确地收到编译器错误:
capture 中的标识符必须是在 lambda 的到达范围内声明的具有自动存储持续时间的变量
我可以捕捉一个static
在嵌套的 lambda 中?看似合理,但问题却不少!
EDIT:
佛子指出 https://stackoverflow.com/questions/33285103/capturing-a-lambdas-static-in-a-nested-lambda?noredirect=1#comment54371126_33285103 that I can如果我将嵌套 lambda 的参数类型从const auto&
to const int&
。这看起来完全无关,但它确实有效。
如果我尝试捕获,这不起作用row
明确地。在这种情况下,我仍然收到编译器错误:
capture 中的标识符必须是在 lambda 的到达范围内声明的具有自动存储持续时间的变量
我在这里报告了 Visual Studio 2015 错误:https://connect.microsoft.com/VisualStudio/feedback/details/1930409/capturing-a-lambdas-static-in-a-nested-lambda https://connect.microsoft.com/VisualStudio/feedback/details/1930409/capturing-a-lambdas-static-in-a-nested-lambda