Qt:lambda表示式
說明
c11之後加入了lambda表示式,所以Qt也支援
載入項
CONFIG += c++11
用法
[ capture ] ( parameters ) mutable -> return_type { code }
說明
capture | 捕獲列表 |
[]是Lambda引出符。編譯器根據該引出符判斷接下來的程式碼是否是Lambda函式。 捕獲列表可以捕獲上下文中變數以供Lambda函式使用,[]中的捕獲列表由多個捕獲項組成,並以,分隔。 捕獲列表的幾種形式: [var]:值傳遞捕捉變數var; [&var]:引用傳遞捕獲變數var; [=]:值傳遞捕獲所有父作用域變數(包括this) [&]:引用傳遞捕獲所有父作用域變數(包括this); [this]:值傳遞捕獲當前的this指標。 父作用域:包含Lambda的{}程式碼塊。 上述捕獲列表還可以進行組合,例如: [= , &a , &b]:引用傳遞捕獲a、b,值傳遞捕獲其他所有變數; [& , a ,this]:值傳遞捕獲a和this,引用傳遞捕獲其他所有變數。 注意,捕獲列表不允許重複傳遞,不然會導致編譯錯誤: [= , a]:已經以值傳遞方式捕獲了所有變數,但是重複捕捉a; [& , &this]:已經以引用傳遞捕獲了所有變數,但是重複捕捉了this。 |
parameters | 引數列表 | 與普通函式引數列表一致。如果不需要引數傳遞,可以和括號()一起省略 |
mutable | mutable修飾符 |
預設情況下,Lambda函式總是一個const函式,mutable可以取消其常量性。在使用該修飾符時,引數列表不能省略(即使為空)。 const函式中,只能修改static變數,也就是說,通過值傳遞時,不能修改任何上下文所有非static變數; 除非:1、通過引用傳遞修改變數值(會同時改變上下文變數); 2、mutable修飾符,可以在函式中修改變數值,但是值傳遞時這個變數只是區域性變數,引用傳遞會同時修改上下文變數值。 |
->return_type | 返回型別 |
不需要返回值時,可以連同->一起省略。 此外,返回型別明確時,也可省略該部分,讓編譯器對返回型別進行推導 |
{statement} | 函式體 |
內容與普通函式一樣,不過除了可以使用引數之外,還可以使用所有捕獲的變數。 與普通函式的區別在於:Lambda函式可以通過捕獲列表訪問一些上下文中的資料。 捕獲列表中描述了上下文中哪些資料可以被Lambda使用以及使用方法(值傳遞、引用傳遞) |
例子
一個簡單的Lambda
auto func = [= , &b] (int c) ->int {return b += a + c ;}
mutable的用法
int n = 0; auto func1 = [=](){ n = 3; }; //wrong!!! auto func2 = [=]() mutable { val = 3; };//可以修改上下文變數,但只是區域性變數 func2(); cout<<n<<endl; // 0 auto func3 = [&]() { n = 4; };//可以修改上下文變數,同時改變它 func3(); cout<<n<<endl; // 4 auto func4 = [&]() mutable{ n = 5; };//可以修改上下文變數,同時改變它 func4(); cout<<n<<endl; // 5