[C++ピット実録]Lambda値によるキャプチャとarray

642 ワード

背景
環境を学ぶ友达が、私たちを回るつもりで、今日たまたま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;