2012-10-03 29 views
1

這是幹什麼的?具體來說,我在'this'對象中有20個3個字段,我想要傳遞給lambda。如果我使用[&],它只會使用我使用的3個字段?他們會通過參考或價值傳遞嗎?瞭解C++ lambda捕獲規範中的[&]

感謝

+0

讓我們看看代碼? –

+2

「*如果我使用'[&]'它將只使用我使用的3個字段?*」不,它將需要一個字段 - 「this」。 「*它們將通過引用或值傳遞嗎?*」'&'表示傳遞引用;如果它是'=',它會通過val。但鑑於你只是捕獲一個指針,在這種情況下沒有區別。 – ildjarn

+0

@ildjarn:「*不,它會佔用一個字段 - 這個。*」不,它不會,但那只是因爲你不能通過引用捕獲這個'this'。當你嘗試使用成員變量時,編譯器應該會出錯,而不是通過隱式地捕獲所有值或者明確地捕獲'this'。 –

回答

8

是什麼([&])呢?

它指定所有(隱式)捕獲通過引用捕獲。也就是說,它的行爲就好像存在一個由實際捕獲的對象初始化的閉包對象的隱藏引用成員。

我有20個'我'要傳遞到lambda'這個'對象中的3個領域。如果我使用[&],它只會使用我使用的3個字段?

沒有,如果你只捕獲this對象的成員,只有this指針被捕獲(總是由值)。

+1

根據[5.12:15]:'沒有指定是否在引用捕獲的實體 的封閉類型中聲明瞭額外的未命名的非靜態數據成員,因此是否確實存在隱藏成員不是由標準。 –

+1

@JesseGood:這就是爲什麼我使用措辭「......好像存在...」 – jpalecek

+0

是的,我認爲你的回答是好的(我upvoted)。我只是想說得更清楚。 –

2

使用[&]作爲C++ 11 lambda中的捕獲規範簡單地表示在lambda中引用的任何變量將被視爲在捕獲規範中使用&varname隱式指定。 lambda不會捕獲任何未引用的變量。

+1

「此外,這個值是特殊的,它不能通過引用捕獲,只能通過值來捕獲。因爲你試圖引用這個字段,所以你實際上隱式捕獲它,因爲你不能通過引用捕獲它,所以使用[ &]將不起作用,您需要使用[=]或使用[this]。「這不是基於標準,在當前的實施中不是這樣。簡而言之,當calture-list是[&]時捕獲'this'應該沒問題。 – jpalecek

+0

@jpalecek:有趣。這是基於維基百科的文檔編寫的(是的,維基百科不是權威的)。無論如何,如果編譯器允許捕獲「this」,我想我並不感到驚訝。我不知道規範說什麼。 –

+1

@jpalecek:你說得對。我檢查了這個規範,並且我沒有看到禁止通過引用來捕獲這個「this」的禁令。我將從我的答案中刪除該部分。 –

2

捕獲規範告訴編譯器如何捕獲不同的變量。使用[&]意味着在lambda內部提到的所有本地範圍的變量都將被引用引用,即只要使用lambda,它們就需要保持在周圍。對這些變量的任何更改都會反映在原始內容中。您也可以使用[=]這將存儲正在使用的變量的副本。如果要混合訪問權限,可以設置默認值並覆蓋之後引用變量的方式,例如,[=,&foo]捕獲通過引用捕獲的除foo之外的所有由值引用的變量。

在任何情況下,lambda對象只會存儲對lambda函數內部實際使用的變量的引用或副本,或者捕獲中提及的顯式(按名稱)(謝謝jpalecek指出明確提到的變量是始終保存)。

在上面提到的上下文中,您提到了成員變量:從未捕獲這些成員變量,因爲它們不在本地作用域中。可以捕獲的是this,但由於它是不可變的,它總是被值捕獲。說到不可變:默認值const按變量捕獲變量。如果你想改變它們,你需要通過在參數列表和lambda函數的主體之間提到mutable來製作lambda函數mutable