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執行時變量是存在的。
一般來說,我們應該盡量減少捕獲的數據量,來避免潛在的捕獲導致的問題。而且,如果可能的話,應該避免捕獲指針或引用。