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
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |