1. 程式人生 > 其它 >Qt:lambda表示式

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