[英]Do c++11 lambdas capture variables they don't use?
當我使用[=]
表示我希望通過 lambda 中的值捕獲所有局部變量時,這是否會導致 function 中的所有局部變量被復制,或者只是Z945F3FC4495168A476B 使用的所有局部變量?
因此,例如,如果我有:
vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });
是否會復制 my_huge_vector,即使我不在 lambda 中使用它?
捕獲列表中明確命名的每個變量都會被捕獲。 默認捕獲將僅捕獲 (a) 未在捕獲列表中明確命名和 (b) 在 lambda 表達式的主體中使用的變量。 如果變量沒有明確命名並且您沒有在 lambda 表達式中使用該變量,則不會捕獲該變量。 在您的示例中,未捕獲my_huge_vector
。
根據 C++11 §5.1.2[expr.prim.lambda]/11:
如果lambda 表達式具有關聯的捕獲默認值,並且其復合語句odr-使用
this
或具有自動存儲持續時間的變量,並且未顯式捕獲使用 odr的實體,則稱使用odr 的實體被隱式捕獲.
您的 lambda 表達式具有關聯的捕獲默認值:默認情況下,您使用[=]
按值捕獲變量。
當且僅當使用變量時(在“使用”一詞的單一定義規則意義上)是隱式捕獲的變量。 由於您根本沒有在my_huge_vector
表達式的主體(“復合語句”)中使用 my_huge_vector,因此不會隱式捕獲它。
繼續 §5.1.2/14
一個實體被副本捕獲,如果
- 它被隱式捕獲,並且捕獲默認值為
=
或如果- 它是使用不包含
&
的捕獲顯式捕獲的。
由於您的my_huge_vector
沒有被隱式捕獲,也沒有被顯式捕獲,因此根本不會通過復制或引用來捕獲它。
不,不會捕獲my_huge_vector
。 [=]
表示所有使用的變量都在 lambda 中捕獲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.