2012-09-04 171 views
10

你好,我發現在Windows文件C++ [b]運營商

這個代碼,但我不明白是什麼意思

[&] 

只是請你能清楚我是什麼應該做的?

它不是C++標準的真實?

這是代碼:

void parallel_matrix_multiply(double** m1, double** m2, double** result, size_t size) 
{ 
    parallel_for (size_t(0), size, [&](size_t i) 
    { 
     for (size_t j = 0; j < size; j++) 
     { 
     double temp = 0; 
     for (int k = 0; k < size; k++) 
     { 
      temp += m1[i][k] * m2[k][j]; 
     } 
     result[i][j] = temp; 
     } 
    }); 
} 

回答

16

它是C++ 11的一個特性,被稱爲lambda捕獲子句。在這種情況下,[&]通過引用使lambda函數可用於parallel_matrix_multiply()函數的所有參數。

查看lambda functions瞭解更多信息。

+0

「通過引用lambda函數」使'parallel_matrix_multiply()函數的所有參數「? –

+1

@SteveJessop,'[&]'通過引用使lambda函數體中的所有變量都可用,包括函數'parallel_matrix_multiply()'的參數。這是不正確的還是隻是容易混淆的措詞? – hmjd

+0

這是正確的(據我所知:我不知道是否有任何令人困惑的邊緣情況)。我的評論只是想讓這個句子變得不那麼笨拙,如果我沒有表達這個意思,我很抱歉。 –

4

這是一個lambda函數,C++ 11特徵

[&](size_t i){...} 

將被用作一個回調或算符。所以你不需要在其他地方寫另一個函數來傳遞給parallel_for。

12

它引入了lambda表達式。方括號 的內容表示在lambda內部要捕獲的內容。在那裏只有一個& 意味着在lambda和 內提到的所有內容都可以在其範圍外被發現,並被引用捕獲。

實施例:

int a = 0; 
auto l = [&]() { 
    ++a; // a refers to the a outside of this scope through a reference 
} 
l(); // execute the lambda 
+0

這是一個很好的例子...我喜歡裏面的評論,它使得更清晰的意義 –

+0

因此,如果我寫[=]和我編輯一個變量,那麼外側的lambda函數的值改變了?或者這不是因爲沒有通過引用傳遞? –

+0

@frank:如果你只是改變&to =它不會編譯,因爲你不能改變複製的變量,除非你明確地表示你打算這樣做mutable關鍵字。 – sellibitze

5

這是用於lambda表達式捕獲子句。一個lambda表達式可以訪問它的封閉範圍的所有變量(即,如果lambda在一個函數內,它可以訪問該函數內的所有變量)。 [&]表示該lambda將通過參考獲得所有變量。他們也可以通過值採取,在這種情況下,你會使用[=]。你還可以指定要採取的具體方式,需要具體的變量,例如下面的代碼:

[&X, =] 

意味着拉姆達將參照採取X變量,和所有其他的價值。

+0

所以,如果我寫[=]和我編輯一個變量....然後ouside lambda函數的值改變?我想不是......對吧? –

+0

@frank,是的,如果你寫[=],lambda以外的值將保持不變,無論你做什麼。 – SingerOfTheFall

+0

這相當於將一個變量按值傳遞給常規函數:調用者的副本不會更改。您可以使用玩具示例輕鬆確認這一點。 – Useless

5

[&]表示您將有權訪問lambda表達式中的周圍代碼的變量,並且將通過引用來訪問(即您可以修改它們)。在示例代碼中,您可以看到m1, m2, resultsize在lambda experssion中使用,即使它們不作爲參數傳遞。

+2

從技術上講,你不能以任何方式修改變量,因爲未明確指定爲mutable的lambda具有const操作符(),所以捕獲的變量不能更改。對於'mutable' lambda,可以在兩種情況下更改變量,但是隻有在lambda之外才可以看到變化,以便通過引用進行捕獲 – Grizzly