匿名函數是指不需要聲明和定義的函數,匿名函數僅需要在使用時候進行創建。匿名函數的 結構如下:
[capture](parameters)->return-type{body}
capture
- []:未定義變量,不允許在函數體內使用任意外部臨時變量,全局變量可以使用;
- [x, &y]:x 按值捕獲,y 按引用捕獲;
- [&]:外部臨時變量都按引用捕獲;
- [=]:外部臨時變量都按值捕獲;
- [&, x]:x 按值捕獲,其它臨時變量按引用捕獲;
- [=, &x]:x 按引用捕獲. 其它臨時變量按值捕獲。
示例
[]:未定義變量,不允許在函數體內使用任意外部臨時變量,全局變量可以使用
int x = 0;
int main() {
int y = 0;
auto func = [] {
x = 1;
// y = 1; 錯誤
};
func();
std::cout << x << ' ' << y << std::endl;
return 0;
}
// 輸出:1 0
[x, &y]:x 按值捕獲,y 按引用捕獲
int x = 1, y = 1;
auto func = [x, &y] {
// x = 1; 錯誤
y = x + 2;
};
func();
std::cout << x << ' ' << y << std::endl;
// 輸出:1 3
[&]:外部臨時變量都按引用捕獲
int x = 1, y = 1;
auto func = [&] {
x = 2;
y = 2;
};
func();
std::cout << x << ' ' << y << std::endl;
// 輸出:2 2
[=]:外部臨時變量都按值捕獲
int x = 1, y = 1;
auto func = [=] {
// x = 2; 錯誤
return x + y;
};
std::cout << func() << std::endl;
// 輸出:2
[&, x]:x 按值捕獲,其它臨時變量按引用捕獲
int x = 1, y = 1;
auto func = [&, x] {
// x = 2; 不允許
y = 2;
};
func();
std::cout << x << ' ' << y << std::endl;
// 輸出:1 2
[=, &x]:x 按引用捕獲. 其它臨時變量按值捕獲
int x = 1, y = 1;
auto func = [=, &x] {
x = 2;
// y = 2; 不允許
};
func();
std::cout << x << ' ' << y << std::endl;
// 輸出:2 1
參數及返回值
int main() {
auto max = [](int a, int b) -> int {
return a > b ? a : b;
};
std::cout << max(1, 2) << std::endl;
return 0;
}
匿名函數傳遞
#include <iostream>
void handle(const std::function<void(int, std::string)> &callback) {
callback(200, "success");
}
int main() {
auto callback = [](int status, const std::string &msg) {
std::cout << "status: " << status << ", " + msg << std::endl;
};
handle(callback);
return 0;
}