《C++标准库第2版》侯捷译 - 第3章 C++11 语言新特性 - 3.1.10 Lambda - 读书笔记



Lambda


1. Lambda 语法


lambda是一份功能定义,可被定义与语句或表达式内部。
因此你可以拿lambda当做inline函数使用


lambda表达式形式如下

[capture list] (parameter list) -> return type { functiono body}

[capture list] (parameter list) mutable -> return type { functiono body}

lambda如何使用

#include <iostream>
using namespace std;
int main()
{
    // 1、直接调用
    [] {
        cout << "hello lambda "
             << "\t" << 1 << endl;
    }(); // 直接调用,输出:hello lambda    1

    // 2、把它传递给对象,使之能被调用
    auto a1 = [] {
        cout << "hello lambda "
             << "\t" << 2 << endl;
    };
    a1(); // 通过对象调用,输出:hello lambda    2

    // 3、传参
    auto a2 = [](const string &s) {
        cout << s
             << "\t" << 3 << endl;
    };
    a2("hello lambda"); // hello lambda    3

    return 0;
}
[root@lwh testcpp]# ./test4.out 
hello lambda    1
hello lambda    2
hello lambda    3
[root@lwh testcpp]# 

2. capture(用以访问外部作用域)

在lambda的[ ]中,指明一个capture list来处理外部作用域内未被传递为实参的数据;
[=] 意味着外部作用域以by value方式传递给lambda。此时,你可以读取所有可读数据,但不能改动它们。
[&] 意味着外部作用域以by reference方式传递给lambda,此时,你对所有数据的涂写动作都合法,前提是你拥有涂写它的权力。


#include <iostream>
using namespace std;
int main()
{
    int x = 0, y = 42;
    auto qqq = [x, &y]() {
        cout << "x: " << x << "\ty: " << y << endl;
        ++y; // OK
    };
    x = y = 77;
    qqq(); // x: 0    y: 77 // 内部的x,外部的y
    qqq(); // x: 0    y: 78 // 内部的x,外部的y
    cout << "finally x: " << x
         << "\ty: " << y << endl;
    // finally x: 77    y: 79 // 外部的x,外部的y
    return 0;
}

by value 传递x;
此时内部的x是外部x的copy,且内部的x是const的,即内部不可对x进行涂写;
by reference传递y
此时内部涂写y,就是涂写外部的y


#include <iostream>
using namespace std;
int main()
{
    int id = 0;
    auto f = [id]() mutable {
        cout << "id: " << id << endl;
        ++id; // OK
    };
    id = 42;
    f();                               // id: 0 // 内部的x
    f();                               // id: 1 // 内部的x
    f();                               // id: 2 // 内部的x
    cout << "finally: " << id << endl; // finally: 42 // 外部的x
    return 0;
}

[root@lwh testcpp]# ./test4.out 
id: 0
id: 1
id: 2
finally: 42

by value 传递x;
此时内部的x是外部x的copy,且内部的x是const的,
但此时指定了mutable,此时允许涂写x;
注意,此时涂写的是内部的x,对外部的x没影响


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值