1. auto lambda = [](double x) { return static_cast<int>(x); }; 是 匿名函数对象 ,不可直接声明
a.可以赋值给一个与其类型兼容的 std::function
类型的对象 std::function<int(int, int)> lambda = [](int x, int y) { return x + y; };
b.使用具体的 lambda 类型(函数指针) int (*lambda1)(int, int) = [](int x, int y) { return x + y; };
c. 推导类型decltype([](int x, int y) { return x + y; }) lambda = [](int x, int y) { return x + y; };
decltype 用于推导一个表达式的类型,而不是像 auto
那样推导变量的类型
int x = 5;
double y = 2.5;
decltype(x + y) z = x + y; // decltype(x + y) 等同于 double
std::cout << z << std::endl; // 输出 7.5
2. 什么样的lambda不能复制给function
1. 捕获非复制对象的 lambda
std::unique_ptr<int> ptr = std::make_unique<int>(42);
// 捕获了一个不可复制的对象 std::unique_ptr
auto lambda = [ptr]() { return *ptr; };
std::unique_ptr<int> 是不可复制的,它的移动语义导致 lambda 无法被复制。因此,std::function 也无法复制该 lambda ,可以改为捕获指针或其他可复制的对象。
auto lambda = [ptr = std::move(ptr)]() { return *ptr; };
2.捕获了外部局部变量,并且该变量是不可复制的(例如,捕获了一个带有删除拷贝构造函数的类型),就不能将其赋值给 std::function
#include <iostream>
#include <functional>
struct NonCopyable {
NonCopyable() = default;
NonCopyable(con