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