背景
一个学环境的朋友,正准备转码农,今天碰巧遇到一个Bug。
这里,我把代码简化之后,来看看到底哪里出现了问题?
代码
int main() {
int collection[5] = {};
auto process = [=]() { // 按值捕获
for(int i : collection)
std::cout << i << " ";
};
for(int i=0; i < 5; ++i)
collection[i] = i;
process();
}
所以,你觉得这段代码运行后,输出会是 0, 1, 2, 3, ..吗?
如果,从C array的角度来看,好像这么想也没什么问题,是吗?
就好比,指针按值传递给函数一样?
但是,实际上呢?
但是,Lambda按值捕获C array时,会逐成员拷贝元素;
所以,最终的结果,可能会令人出乎意料,0, 0, 0 , 0...
怎么办?
就我而言,我更倾向于改用std::array;