QT中lambda表达式
1.因為lambda表達式是c++11的特性
我們5.5及以上版本是支持的,5.4及一下需要在.pro文件中加入
CONFIG?+=?c++11lambda 的語法形式如下:
[函數對象參數] (操作符重載函數參數) mutable 或 exception 聲明 -> 返回值類型 {函數體}可以看到,Lambda 主要分為五個部分:[函數對象參數]、(操作符重載函數參數)、mutable 或 exception 聲明、-> 返回值類型、{函數體}.
2. Lambda 語法分析
2.1 [函數對象參數]
標識一個 Lambda 表達式的開始,這部分必須存在,不能省略。函數對象參數是傳遞給編譯器自動生成的函數對象類的構造
函數的。函數對象參數只能使用那些到定義 Lambda 為止時 Lambda 所在作用范圍內可見的局部變量(包括 Lambda 所在類
的 this)。函數對象參數有以下形式:
- 空。沒有任何函數對象參數。
- =。函數體內可以使用 Lambda 所在范圍內所有可見的局部變量(包括 Lambda 所在類的 this),并且是值傳遞方式(相
當于編譯器自動為我們按值傳遞了所有局部變量)。 - &。函數體內可以使用 Lambda 所在范圍內所有可見的局部變量(包括 Lambda 所在類的 this),并且是引用傳遞方式
(相當于是編譯器自動為我們按引用傳遞了所有局部變量)。 - this。函數體內可以使用 Lambda 所在類中的成員變量。
- a。將 a 按值進行傳遞。按值進行傳遞時,函數體內不能修改傳遞進來的 a 的拷貝,因為默認情況下函數是 const 的,要
修改傳遞進來的拷貝,可以添加 mutable 修飾符。 - &a。將 a 按引用進行傳遞。
- a,&b。將 a 按值傳遞,b 按引用進行傳遞。
- =,&a,&b。除 a 和 b 按引用進行傳遞外,其他參數都按值進行傳遞。
- &,a,b。除 a 和 b 按值進行傳遞外,其他參數都按引用進行傳遞。
2.2 (操作符重載函數參數)
標識重載的 () 操作符的參數,沒有參數時,這部分可以省略。參數可以通過按值(如: (a, b))和按引用 (如: (&a, &b)) 兩種
方式進行傳遞。
2.3 mutable 或 exception 聲明
QPushButton *bt = new QPushButton("rerew",this);bt->move(100,100);int m=10;connect(bt,&QPushButton::clicked,this,[m]()mutable{m=m+10;qDebug()<<m;});這部分可以省略。按值傳遞函數對象參數時,加上 mutable 修飾符后,可以修改傳遞進來的拷貝(注意是能修改拷貝,而不是
值本身)。exception 聲明用于指定函數拋出的異常,如拋出整數類型的異常,可以使用 throw(int)。
2.4 -> 返回值類型
標識函數返回值的類型,當返回值為 void,或者函數體中只有一處 return 的地方(此時編譯器可以自動推斷出返回值類型)
時,這部分可以省略。
2.5 {函數體}
標識函數的實現,這部分不能省略,但函數體可以為空。
3. 示例
[] (int x, int y) { return x + y; } // 隱式返回類型 [] (int& x) { ++x; } // 沒有 return 語句 -> Lambda 函數的返回類型是 'void' [] () { ++global_x; } // 沒有參數,僅訪問某個全局變量 [] { ++global_x; } // 與上一個相同,省略了 (操作符重載函數參數)可以像下面這樣顯示指定返回類型:
[] (int x, int y) -> int { int z = x + y; return z; }在這個例子中創建了一個臨時變量 z 來存儲中間值。和普通函數一樣,這個中間值不會保存到下次調用。什么也不返回的
Lambda 函數可以省略返回類型,而不需要使用 -> void 形式。
Lambda 函數可以引用在它之外聲明的變量. 這些變量的集合叫做一個閉包. 閉包被定義在 Lambda 表達式聲明中的方括
號 [] 內。這個機制允許這些變量被按值或按引用捕獲。如下圖的例子:
3.1 示例 1
std::vector<int> some_list; int total = 0; for (int i = 0; i < 5; ++i) some_list.push_back(i); std::for_each(begin(some_list), end(some_list), [&total](int x) {total += x; });此例計算 list 中所有元素的總和。變量 total 被存為 Lambda 函數閉包的一部分。因為它是棧變量(局部變量)total 引
用,所以可以改變它的值。
3.2 示例 2
std::vector<int> some_list; int total = 0; int value = 5; std::for_each(begin(some_list), end(some_list), [&, value, this](int x) {total += x * value * this->some_func(); });此例中 total 會存為引用, value 則會存一份值拷貝。對 this 的捕獲比較特殊,它只能按值捕獲。this 只有當包含它的最靠近
它的函數不是靜態成員函數時才能被捕獲。對 protect 和 private 成員來說,這個 Lambda 函數與創建它的成員函數有相同
的訪問控制。如果 this 被捕獲了,不管是顯式還是隱式的,那么它的類的作用域對 Lambda 函數就是可見的。訪問 this 的
成員不必使用 this-> 語法,可以直接訪問。
總結
以上是生活随笔為你收集整理的QT中lambda表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程:Lambda 表达式
- 下一篇: IP地址后面跟/(斜线)+数字含义