關于lambda的捕獲和呼叫
C++ primer上對可變lambda舉的例子如下:
size_t v1=42;
auto f=[v1] () mutable{return ++v1; };
v1=0;
auto j=f(); //j 為 43
因為原則上不能改變值捕獲的v1,所以要在lambda里改變v1的話,需要加上mutable關鍵字,
我一開始不理解為什么j為43,而不是1,說明捕獲是發生在auto f=[v1] () mutable{return ++v1; };這句,而函式體內部陳述句呼叫,是在呼叫f()的時候執行,
呼叫完f(),再輸出v1的值,此時由于之前lambda是值捕獲,所以v1的值沒有改變是0,
size_t v1=42;
auto f=[&v1] () {return ++v1; };
v1=0;
auto j=f(); //j 為 1
如果是參考捕獲,那就比較直觀,因為v1是參考,所以當v1的值改變成0后,再呼叫f(),lambda函式體內部是0的值自加1,
歸根究底,lambda加上mutable關鍵字后,值捕獲v1,會在lambda內部生成個臨時變數存盤v1的值,從而每次呼叫進行的改變是可以累積的,如下:
size_t v1=42;
auto f=[v1] () mutable{return ++v1; };
v1=0;
auto j=f(); //j 為 43
auto k=f(); //j 為 44
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98164.html
標籤:C++
