如何在lambda中按值捕获`this`和局部变量?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在lambda中按值捕获`this`和局部变量?相关的知识,希望对你有一定的参考价值。
下面的lambda函数捕获this
(因此bar()
可以访问其实例变量)和局部变量a,b,c
。
class Foo
{
int x, y, z;
std::function<void(void)> _func;
// ...
void bar()
{
int a, b, c;
// ...
_func = [this, a, b, c]() // lambda func
{
int u = this->x + a;
// ...
};
}
};
但是,如果我想捕获许多实例变量,并希望避免在捕获列表中明确命名它们,我做到了[[not似乎可以做到这一点:
_func = [this, =]() // lambda func
{
// ...
};
我在=
之后的this,
处遇到编译器错误:
error: expected variable name or 'this' in lambda capture list
如果我尝试这个
_func = [=,this]() // lambda func { // ... };
我知道
error: 'this' cannot be explicitly captured when the capture default is '='
是否存在用于按值捕获this
和其他所有内容的捷径?
[=]通过副本捕获lambda主体中使用的所有自动变量,并通过引用捕获当前对象使用的所有自动变量
[=]
已按值捕获this
。看一下下面的实时代码:http://cpp.sh/87iw6#include <iostream>
#include <string>
struct A {
std::string text;
auto printer() {
return [=]() {
std::cout << this->text << "
";
};
}
};
int main() {
A a;
auto printer = a.printer();
a.text = "Hello, world!";
printer();
}
[=]
做您想要的-它按值捕获非成员变量,按引用捕获*this
(或按值捕获this
的对象。)>[*this,=]
捕获两个局部变量
和
通过c++17中的值捕获对象。[[&]
按引用捕获局部变量,按引用捕获*this
或按值捕获this
(指针)。两个默认捕获模式都以相同方式捕获this
。您只能在c++17中进行更改。
[=]
将起作用,因为它会通过复制捕获lambda主体中使用的所有自动变量。以上是关于如何在lambda中按值捕获`this`和局部变量?的主要内容,如果未能解决你的问题,请参考以下文章