gpt4 book ai didi

c++ - 通过值捕获lambda

转载 作者:行者123 更新时间:2023-12-02 09:48:13 25 4
gpt4 key购买 nike

我在struct Baz中定义了一个lambda,它通过值捕获struct的实例。因此,我希望如果lambda主体中的struct成员发生修改,它不会出现在lambda之外,而是会出现。
另外,我在函数中定义了一个lambda(在struct之外),该函数通过复制捕获struct来实现预期的功能。
您能否提供一些澄清,以了解struct内部的lambda发生了什么?

 #include <iostream>
struct Baz {
auto foo() {
return [=] { std::cout << s << '\n'; s = "TEST1"; };
}
auto foo2()
{
return [=] {std::cout <<"foo2" << s << '\n';};
}
auto get()
{
return s;
}
std::string s;
};
void test(Baz & c)
{

auto lambda = [=]() mutable {

c.s = "TEST2";
std::cout <<"InFunc:" << c.s << "\n"; // output TEST2
};
std::cout << c.s << "\n";//output TEST1
lambda();

std::cout << c.s << "\n";//output TEST1 //here the output as expected(capture by value)
}
int main() {
Baz baz{"INITSTR"};
std::cout << baz.get() << std::endl; //output INITSTR
auto f1 = baz.foo();
f1();//output INITSTR
std::cout << baz.get() << std::endl; //output TEST1 //here i expect to got INITSTR instead of TEST1 (because the capture lambda is by value)
auto f2 = baz.foo2();
f2();//output TEST1
std::cout << baz.get() << std::endl; //output TEST1
test(baz);
}

最佳答案

s不是捕获的变量,它是捕获的this指针的成员变量。
由于这种有时令人意外的行为,因此在使用this捕获时,c++ 20已弃用[=]指针的捕获。如果要捕获s的副本,则需要明确地执行以下操作:

 struct Baz {
auto foo() {
return [s=s]() mutable { std::cout << s << '\n'; s = "TEST1"; };
}
auto foo2()
{
return [this]() {std::cout <<"foo2" << s << '\n';};
}
auto get()
{
return s;
}
std::string s;
};
请注意,在修改捕获的变量时,需要将其设置为lamt mutable。为了避免 s遮蔽成员变量的困惑,我可能会重命名它:
return [s_copy=s]() mutable { std::cout << s_copy << '\n';  s_copy = "TEST1"; };

关于c++ - 通过值捕获lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63110896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com