簡體   English   中英

c++11 lambdas 是否捕獲他們不使用的變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM