c++11:lambda表達式的使用


lambda表達式的一般形式:

 [capture list] (parameter list) -> return type{function body}; 

其中,capture list (捕獲列表)是一個lambda所在函數中定義的局部變量的列表(通常為空);

return type、parameter list和function body與任何普通函數一樣分別表示返回類型、參數列表和函數體。

但是與普通函數不同,lambda必須使用尾置返回來指定返回類型。

 

此外,我可以忽略參數列表和返回類型,但必須永遠包含捕獲列表和函數體:

auto f = [] { return 42 }

此例中,我們定義了一個可調用的對象f, 它沒有參數,返回值為42;

 

調用方式:與普通函數一致;

cout << f() << endl;

在忽略了返回值類型的情況下, lambda根據函數體中代碼推斷出返回值類型;如果函數體只是一個return語句,則返回類型從返回的表達式的類型推斷而來。否則,返回類型為void。

 

使用條件:

“引用捕獲有時是必要的。例如, 我們可能希望biggies函數接受一個ostream的引用,用來輸出數據,並接受一個字符作為分隔符:”

void biggies(vector<string> &words, 
                  vector<string> ::size_type sz,
                  ostream &os = cout, char c = ' ')
{
     //打印count的語句改為打印到os
    for_each(words.begin(), words.end(),
                  [&os, c] (const string &s) { os << s << c; });          
}

我們不能拷貝ostream對象,因此捕獲os的唯一方法就是捕獲其引用(或指向os的指針)。

注意:當引用方式捕獲一個變量時,必須保證lambda執行時變量是存在的

 

一般來說,我們應該盡量減少捕獲的數據量,來避免潛在的捕獲導致的問題。而且,如果可能的話,應該避免捕獲指針或引用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM