lambda教學 - c++ 11 lambda表達式捕獲它們不使用的變量嗎?




lambda c++用法 (2)

不, my_huge_vector不會被捕獲。 [=]表示所有使用的變量都在lambda中捕獲。

當我使用[=]來指示我希望所有局部變量被lambda中的值捕獲時,會導致被複製的函數中的所有局部變量,還是lambda使用的所有局部變量?

所以,例如,如果我有:

vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });

即使我不在lambda中使用它,是否會復制my_huge_vector?


捕獲列表中明確命名的每個變量都被捕獲。 默認捕獲將只捕獲(a)未在捕獲列表中明確命名的變量以及(b)在lambda表達式的主體中使用的變量。 如果一個變量沒有明確命名,並且你沒有在lambda表達式中使用這個變量,那麼這個變量就不會被捕獲。 在你的例子中, my_huge_vector沒有被捕獲。

Per C ++ 11§5.1.2[expr.prim.lambda] / 11:

如果lambda表達式具有關聯的capture-default並且其複合語句 odr-使用 this變量或具有自動存儲持續時間的變量,並且未明確捕獲odr-used實體,則稱該odr-used實體隱式捕獲。

您的lambda表達式具有關聯的捕獲默認值:默認情況下,您使用[=]按值捕獲變量。

當且僅當使用變量時(在“一個定義規則”中,術語“used”)才是隱式捕獲的變量。 由於您在lambda表達式的正文(“複合語句”)中根本不使用my_huge_vector ,因此不會隱式捕獲它。

繼續§5.1.2/ 14

如果一個實體被副本捕獲

  • 它被隱式捕獲並且捕獲默認值為=或if
  • 它是明確捕獲的,不包含&的捕獲。

由於您的my_huge_vector未被隱式捕獲,並且沒有明確捕獲,因此根本無法通過複製或引用來捕獲它。





c++11