c++ lamdba表达式

语法形式:

[函数对象参数] [(表达式参数)] [mutable/exception声明] [->返回值类型] {函数体}

/**
 * c++ lambda表达式
 * 
 * 语法形式:[函数对象参数] [(表达式参数)] [mutable/exception声明] [->返回值类型] {函数体}
 * 
 * 1. 函数对象参数
 *  []  :无参数
 *  [=] :值传递所有可见的局部变量
 *  [a] :值传递局部变量a
 *  [&] :引用传递所有可见的局部变量
 *  [&a]:引用传递局部变量a
 *  [&,a]:a是值传递,其他可见的局部变量是引用传递
 *  [=,&a]:a是引用传递,其他可见的局部变量是引用传递
 *  
 * lambda的可见性不高于函数对象参数的可见性(使用了局部变量的lambda只能在局部变量可见的区域有效)
 * 
 * 2. 表达式参数(方法参数)
 *  与一般函数参数一致;若无参数,则可省略
 * 
 * 3. mutable或exception声明
 *  可省略,与函数的mutable和exception声明一致
 *  mutable声明可修改参数的拷贝
 * 
 * 4. 返回值类型
 *  可省略
 * 
 * 5. 函数体
 *  与普通函数一致
*/

#include <iostream>
using namespace std;

typedef bool (*fun)(const int &v);

void exec(fun f, int &v)
{
    bool ret = f(v);
}

fun getFun()
{
    int a = 100;
    char str[100];

    auto f0 = [a](const int &v) -> bool { return a > v; }; // 显式指定函数对象参数为a;显式指定返回值类型为bool;表达式参数v
    auto f1 = [=](const int &v) { return a > v; };         // 函数对象参数为=,函数体内可以使用所有可见的局部变量,并且是值传递方式;隐式指定返回值类型为bool
    auto f2 = [&](const int &v) { return a > v; };         // 函数对象参数为&,函数体内可以使用所有可见的局部变量,并且是引用传递方式;隐式指定返回值类型为bool
    auto f3 = [](const int &v) { return 1 > v; };          // 无函数对象参数;隐式指定返回值类型为bool
    auto f4 = [&a](const int &v) { a = v; };               // 

    auto f5 = [&a] { cout << a << endl; };                  // 省略表达式参数;省略返回值

    auto f6 = [a, str](const int &v) {};

    // return (fun)f0;  // 代码错误,使用了局部变量,则lambda不能离开局部区域
    return f3; // 无局部变量,正确
}

参考:
C++之Lambda表达式

发布了158 篇原创文章 · 获赞 69 · 访问量 25万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览