私は次のコードブロックを持っています。私が期待したのは、ラムダキャプチャリスト内のi
が値渡しされ、i
が出力されるはずです。ループ内のこのラムダ関数がなぜパラメータを値で取得しなかったのですか?
しかし、実際の結果は19 is completed
という出力20行です。
この行をに変更しようとしましたが、std::thread t([func](){
に出力すると、異なるi
の値が出力される可能性があります。
私の質問は、std::thread t([&func](){
とstd::thread t([func](){
がiの異なる出力値を導くのはなぜですか?
void DoSomething(std::function<void()> func)
{
std::thread t([&func](){
//do something
sleep(1);
if (func)
func();
});
t.detach();
}
int main(int argc, const char * argv[]) {
std::mutex mtx;
for (int i = 1 ; i < 20; i ++) {
DoSomething([i, &mtx](){
std::unique_lock<std::mutex> lock(mtx);
std::cout << i << " is completed" << std::endl;;
});
}
sleep(10);
}
これは、DoSomethingに渡された関数がキャプチャリストに関する情報を保持していることを意味しますか? – 2power10
@ 2power10あなたが何を求めているのか分かりません。参照でキャプチャする場合は、参照オブジェクトが使用時に有効であることを確認する必要があります。そうでない場合、プログラムは未定義です。価値によって取り込むことは、ここでは正しいことです。 – molbdnilo