簡體   English   中英

捕獲Lambda列表在C ++ 11中實際上如何工作?

[英]How do capture lists of lambdas actually work in C++11?

我知道捕獲列表使變量可以在lambda函數體內使用,如下所示:

int pos(0);
std::function<void()> incPos = [&pos](){ ++pos; };
incPos(); //pos is now 1

但是,該捕獲實際上在編譯器級別如何工作? 捕獲的地址或捕獲的值存儲在哪里?

每個lambda表達式都會生成一個唯一的函數對象(閉包),該對象將捕獲的變量存儲為數據成員。 例如,您的代碼中的lambda表達式將被編譯器轉換為如下形式:

struct __uniquely_named_lambda
{
  __uniquely_named_lambda(int& pos)
  : pos(pos) {}
  int& pos;

  void operator()() const
  { ++pos; }
};

調用lambda只是對operator()的調用。

數據成員是參考,因為您是通過參考捕獲的。 如果按值捕獲,它將是一個普通的int 還要注意,默認情況下,生成的operator()const 這就是為什么除非使用mutable關鍵字,否則無法修改捕獲的變量的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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