lambda表達式語法
#include <iostream>
int main(int argc, char* argv[])
{
/**
* 1. 基本形式與語法
*/
//如果沒有傳入參數,參數列表可以省略
auto lambda1 = []() { std::cout << "Hello, World !" << std::endl; };
auto lambda2 = [](int x, int y) -> int //返回參數可使用尾置返回語法
{
if (x > y)
return 1;
else if (x < y)
return -1;
else
return 0;
};
/**
* 輸出:
* Hello, World !
*/
lambda1();
/**
* 輸出:
* -1
*/
std::cout << lambda2(1, 2) << std::endl;
/**
* 輸出:
* 1
*/
std::cout << lambda2(2, 1) << std::endl;
/**
* 輸出:
* 0
*/
std::cout << lambda2(1, 1) << std::endl;
return 0;
}
捕獲
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main(int argc, char* argv[])
{
/**
* lambda表達式捕獲外部變量示例
*/
std::vector<int> vec{ 1,2,3,4,5,6,7,8,9,10 };
std::string str;
//&str為引用捕獲,在函數內部可以被修改
std::for_each(vec.begin(), vec.end(), [&str](int n) {
str.append(std::to_string(n)).append(",");
});
str.pop_back();
/**
* 輸出:
* 1,2,3,4,5,6,7,8,9,10
*/
std::cout << str << std::endl;
//argc為值捕獲(拷貝),該變量在函數內部修改後不會影響外部變量
std::for_each(argv, argv + argc, [argc](char* args) {
/**
* 輸出命令行參數
*/
std::cout << args << std::endl;
});
/**
* 關於其他捕獲語法:
* [=]: 所有外部變量的捕獲均為值捕獲(拷貝)
* [&]: 所有外部變量的捕獲均為引用捕獲
* [=, var...]: var以引用捕獲,其他外部變量以值捕獲
* [&, var...]: var以值捕獲,其他外部變量以引用捕獲
*/
return 0;
}
其他
當lambda表達式不使用[]捕獲時,其表現與函數指針相同;如果使用了[]捕獲,則會變成帶有成員變量(引用或拷貝)和重載operator()函數運算符的類,所以將lambda表達式代入參數為函數指針的函數時,不能使用[]捕獲。