我是靠谱客的博主 无聊溪流,最近开发中收集的这篇文章主要介绍C++ Lambda表达式基本用法(言简意赅,非常清楚)之美捕获选项[] 不捕获任何变量[=] 拷贝捕获[&] 引用捕获[=, &] 拷贝与引用混合[bar] 指定引用或拷贝[this] 捕获 this 指针,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

创建一个匿名函数并执行。Objective-C采用的是上尖号^,而C++ 11采用的是配对的方括号[]。实例如下:


#include <iostream>
using namespace std;
 
int main()
{
    []{
        cout << "Hello,Worldn"; 
    }();
}

我们也可以方便的将这个创建的匿名函数赋值出来调用:


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024;
    auto func = [](int i) { // (int i) 是指传入改匿名函数的参数
        cout << i;
    };
    func(i);
}

捕获选项

  • [] Capture nothing (or, a scorched earth strategy?)
  • [&] Capture any referenced variable by reference
  • [=] Capture any referenced variable by making a copy
  • [=, &foo] Capture any referenced variable by making a copy, but capture variable foo by reference
  • [bar] Capture bar by making a copy; don’t copy anything else
  • [this] Capture the this pointer of the enclosing class

[] 不捕获任何变量


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024;
    auto func = [] { cout << i; };
    func();
}

vs 报错
error C3493: 无法隐式捕获“i”,因为尚未指定默认捕获模式
error C2064: 项不会计算为接受 0 个参数的函数

g++ 报错:
error: ‘i’ is not captured

要直接沿用外部的变量需要在 [] 中指名捕获。

[=] 拷贝捕获


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024;
    auto func = [=]{  // [=] 表明将外部的所有变量拷贝一份到该函数内部
        cout << i;
    };
    func();
}

结果:
1024


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024;
    auto fun1 = [=]{
        // fun1 内存在 i
        cout << i; // 1024
        auto fun2 = []{ // 未指名捕获, i 不存在
            cout << i;
        };
        fun2();
    };
    fun1();
}

[&] 引用捕获


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024;
    cout << &i << endl;
    auto fun1 = [&]{
        cout << &i << endl;
    };
    fun1();
}

结果:
0x28ff0c
0x28ff0c

[=, &] 拷贝与引用混合


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024, j = 2048;
 
    cout << "i:" << &i << endl;
    cout << "j:" << &j << endl;
 
    auto fun1 = [=, &i]{ // 默认拷贝外部所有变量,但引用变量 i
        cout << "i:" << &i << endl;
        cout << "j:" << &j << endl;
    };
    fun1();
}

结果
outside i:0x28ff0c
outside j:0x28ff08
inside i:0x28ff0c
inside j:0x28ff04

[bar] 指定引用或拷贝


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024, j = 2048;
 
    cout << "outside i value:" << i << " addr:" << &i << endl;
 
    auto fun1 = [i]{
        cout << "inside  i value:" << i << " addr:" << &i << endl;
        // cout << j << endl; // j 未捕获
    };
    fun1();
}

结果:
outside i value:1024 addr:0x28ff08
inside i value:1024 addr:0x28ff04


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024, j = 2048;
 
    cout << "outside i value:" << i << " addr:" << &i << endl;
 
    auto fun1 = [&i]{
        cout << "inside  i value:" << i << " addr:" << &i << endl;
        // cout << j << endl; // j 未捕获
    };
    fun1();
}

结果:
outside i value:1024 addr:0x28ff08
inside i value:1024 addr:0x28ff08


#include <iostream>
using namespace std;
 
int main()
{
    int i = 1024, j = 2048, k;
 
    cout << "outside i:" << &i << endl;
    cout << "outside j:" << &j << endl;
 
    auto fun1 = [i, &j]{
        cout << "inside  i:" << &i << endl;
        cout << "inside  j:" << &j << endl;
        // cout << k; // k 未捕获
    };
    fun1();
}

结果:
outside i:0x28ff0c
outside j:0x28ff08
inside i:0x28ff00
inside j:0x28ff08

[this] 捕获 this 指针


#include <iostream>
using namespace std;
 
class test
{
public:
    void hello() {
        cout << "test hello!n";
    };
    void lambda() {
        auto fun = [this]{ // 捕获了 this 指针
            this->hello(); // 这里 this 调用的就是 class test 的对象了
        };
        fun();
    }
};
 
int main()
{
    test t;
    t.lambda();
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最后

以上就是无聊溪流为你收集整理的C++ Lambda表达式基本用法(言简意赅,非常清楚)之美捕获选项[] 不捕获任何变量[=] 拷贝捕获[&] 引用捕获[=, &] 拷贝与引用混合[bar] 指定引用或拷贝[this] 捕获 this 指针的全部内容,希望文章能够帮你解决C++ Lambda表达式基本用法(言简意赅,非常清楚)之美捕获选项[] 不捕获任何变量[=] 拷贝捕获[&] 引用捕获[=, &] 拷贝与引用混合[bar] 指定引用或拷贝[this] 捕获 this 指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部