2016-05-07 86 views
1

在下面for循環中的兩個lambdas中,專家(或者至少比我更專業的人)推薦使用第二個循環中顯示的'j'索引。我想明白,爲什麼在功能上,輸出沒有什麼不同。Lambda函數C++:捕獲循環的索引是否有所作爲?

我的可執行程序在Github上here

for(int j = 0;j<recPtr->numThreads;j++){ 

    recPtr->heads[j] = 0; 
    recPtr->tails[j] = 0; 
    headsPtr = &recPtr->heads[j]; // Get the address of the index of the array, one element for each thread for heads. 
    tailsPtr = &recPtr->tails[j]; // Get the address of the index of the array, one element for each thread for heads. 

    threads.push_back(thread([headsPtr, tailsPtr, timesToToss]() 
    { 
     for(int k=0;k<timesToToss;k++) 
     { 
      if (Tosser(dre)) ++(*headsPtr); 
      else ++(*tailsPtr); 
     } 
    })); //Toss a coin! 
} 


for (int j = 0; j < recPtr->numThreads; j++) 
{ 

    recPtr->heads[j] = 0; 
    recPtr->tails[j] = 0; 
    headsPtr = &recPtr->heads[j]; // Get the address of the index of the array, one element for each thread for heads. 
    tailsPtr = &recPtr->tails[j]; // Get the address of the index of the array, one element for each thread for heads. 

    threads.push_back(thread([j, headsPtr, tailsPtr, timesToToss]() 
    { 
     for(int k=0;k<timesToToss;k++) 
     { 
      if (Tosser(dre)) ++(*headsPtr); 
      else ++(*tailsPtr); 
     } 
    })); //Toss a coin! 
} 
+2

提防誰自稱「專家」,當談到++ ...... – Brian

+1

......或任何其他語言太C的訪客。打電話給其他人一個專家,沒問題。自稱,不。但我不確定我是否明白你想要什麼。你想如何使用j? – deviantfan

+0

在那裏理解了你 - 從我的角度來看,他/她解決了我花了一個多星期的時間看起來很困難的多線程問題,所以也許「比我更專家」更準確。我叫他們是專家。 – NonCreature0714

回答

2

該lambda不使用j,因此沒有理由捕獲它。它沒有提供任何好處。

但是你讓你的封更大由int,產生額外int副本和未來代碼的附加混亂的觀衆(包括你自己),如果代碼的前一次迭代收到所需的j誰可能不知道。因此不要捕獲j

0

你不是在lambda身體用它在你的λ值捕獲的變量j是多餘的...

但在另一方面,如果j是在lambda主體被使用,那麼是的,它需要被捕獲才能使用。更多關於拉姆達捕獲here

這裏是一個小例子:

int main() 
{ 
    int j { 9 }; 
    auto lambda = [ ]() { cout << j << '\n'; }; 
       //^error 'j' not captured 

    lambda(); 
} 
相關問題