C++17新特性 Lambda表达式

//lambda表达式的基本语法如下:
/*
[捕获列表] (参数列表)mutable(可选)异常属性 -> 返回类型 {
    // 函数体
}*/

1,值捕获


//1, 值捕获示例
#include <iostream>
void lambda_value_capture() {
    int value = 1;
    auto copy_value/*返回值*/ = [value/*捕获列表*/](/*参数列表*/)/*自动推导返回值类型*/ {
        return value;//函数体
    };
    value = 100;

    auto stored_value = copy_value(); // 调用lambda表达式
    std::cout << "Stored value: " << stored_value << std::endl; 
    // 这时,stored_value仍然是1,而value==100
    // 因为copy_value在创建时就保存了一份value的拷贝
}

//2,引用捕获示例

void lambda_reference_capture() {
    int value = 1;
    auto copy_value = [&value](/*参数列表*/) mutable {
        return value; // 函数体
    };
    value = 100;

    auto stored_value = copy_value(); // 调用lambda表达式
    std::cout << "Stored value: " << stored_value << std::endl; 
    // 这时,stored_value == 100,value == 100 ;因为copy_value捕获的是value的引用
}

//3,隐式捕获

//手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在

//捕获列表中写一个&或=向编译器声明采用引用捕获或者值捕获

//总结一下,捕获提供了Lambda表达式对外部值进行使用的功能,捕获列表的最常用的四种形式可以是:

//[]空捕获列表

//[name1,name2,...]捕获一系列变量

//[&]引用捕获让编译器自行推导引用列表

//[=]值捕获让编译器自行推导值捕获列表

//4,表达式捕获

//这部分内容需要了解后面马上要提到的右值引用以及智能指针

//上面提到的值捕获、引用捕获都是已经在外层作用域声明的变量,因此这些捕获方式捕获的均为左

//值,而不能捕获右值。

//C++14给与了我们方便,允许捕获的成员用任意的表达式进行初始化,这就允许了右值的捕获,被

//声明的捕获变量类型会根据表达式进行判断,判断方式与使用auto本质上是相同的:


#include <utility>
#include <memory>
int main(){
    auto important = std::make_unique<int>(1);
    auto add = [v1 = 1,v2 = std::move(important)](int x, int y) mutable -> int {
        return x + y + v1 + *v2;
    };

    std::cout << add(3,4) << std::endl; 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值