C++ 为什么可以';数据成员是否在lambda捕获列表中

C++ 为什么可以';数据成员是否在lambda捕获列表中,c++,c++11,lambda,C++,C++11,Lambda,我有一个类foo,它将bar作为成员变量 在类的另一个成员函数中,我编写了一个lambda函数: [bar](void){} 但是我不能在捕获列表中包含bar。为什么会这样?您可以通过在捕获列表中说this来捕获类成员。这与成员是const这一事实无关 例如: #include <iostream> struct Foo { const int a = 0; int b; Foo() : b{42} { auto f = [this]()

我有一个类
foo
,它将
bar
作为成员变量

在类的另一个成员函数中,我编写了一个lambda函数:

[bar](void){}

但是我不能在捕获列表中包含
bar
。为什么会这样?

您可以通过在捕获列表中说
this
来捕获类成员。这与成员是
const
这一事实无关


例如:

#include <iostream>

struct Foo
{
    const int a = 0;
    int b;
    Foo() : b{42} {
        auto f = [this]() { std::cout << a << " " << b << std::endl; };
//                ^^^^ 
        f();
    }
};

int main() {
    Foo x;
}
#包括
结构Foo
{
常数INTA=0;
int b;
Foo():b{42}{

auto f=[this](){std::cout只有具有自动存储持续时间的对象才能被C++11中的lambda捕获(即局部变量和函数参数)。如果您想要捕获
非静态
类数据成员的效果,您可以捕获
this
指针,如下所示:


auto f=[this]{std::cout你确定它与成员是
const
有关吗?事实上,没有。它对所有成员都无效。我会修改这个问题。我为你修改了标题。哎呀。如果你来过梅菲尔,那是我欠你的一杯啤酒。但是使用
[this]
与使用
[a=this->a]不同
-还是我弄错了?@Danvil正确。
[a=this->a]
捕获了
this->a
的副本,但不需要像缓存
this->a
的两行C++11版本那样的中间副本。auto const&a=this->a;是否保存一个副本?
auto f=[&a=this->a]{std::cout这是不正确的。如果在捕获列表中指定
This
,则捕获的是
This
指针的值,而不是类成员的值。您拥有的将在大部分时间编译和工作,但您拥有的不是线程安全的。
a
b
的值可以在ambda是创建的,但在评估之前。请参阅Casey的另一个答案,以使其线程安全。程序员可以选择是否需要副本或引用。您是正确的,但在原始问题中,OP试图通过值而不是引用捕获
bar
。通过值捕获
this
指针会捕获成员v通过引用可以改变。
auto f = [this]{ std::cout << a << std::endl; };
auto a = this->a;
auto f = [a]{ std::cout << a << std::endl; };
auto f = [a = this->a]{ std::cout << a << std::endl; };