我有以下的代碼塊,我的預期是拉姆達捕獲列表內的i
是按值傳遞和i
輸出應該是不同的。爲什麼這個lambda函數在循環中沒有按值捕獲參數?
然而,實際的結果是輸出20行19 is completed
。
我試圖將這一行std::thread t([&func](){
改爲std::thread t([func](){
,輸出結果可能會打印出不同的i
值。
我的問題是爲什麼std::thread t([&func](){
和std::thread t([func](){
會導致我不同的輸出值?
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的FUNC攜帶捕獲列表中的信息? – 2power10
@ 2power10我不確定你在問什麼。如果您通過引用捕獲,則需要確保引用的對象在使用時有效,否則程序未定義。以價值捕獲是在這裏要做的正確事情。 – molbdnilo