C++ 按值捕获lambda
我在structbaz中定义了一个lambda,它通过值捕获struct的实例。所以我希望,若修改发生在lambda主体中的struct成员上,它不会出现在lambda之外,而是会出现。 此外,我在struct之外的函数中定义了一个lambda,该函数通过复制捕获struct,并按照我的预期执行。 能否请您澄清一下lambda在struct内部发生了什么C++ 按值捕获lambda,c++,c++17,C++,C++17,我在structbaz中定义了一个lambda,它通过值捕获struct的实例。所以我希望,若修改发生在lambda主体中的struct成员上,它不会出现在lambda之外,而是会出现。 此外,我在struct之外的函数中定义了一个lambda,该函数通过复制捕获struct,并按照我的预期执行。 能否请您澄清一下lambda在struct内部发生了什么 #include <iostream> struct Baz { auto foo() { r
#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不是捕获的变量,它是捕获的此指针的成员变量
由于这种有时会引起争议的行为,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;
};
s不是捕获的变量,它是捕获的此指针的成员变量
由于这种有时会引起争议的行为,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;
};
将[=]更改为[&]。您希望使用对变量的引用,而不是它们的副本。这也可能有助于:->捕获lambda以进一步information@Creepsy请仔细阅读这个问题。我只是想知道,为什么尽管lambda捕获是按值进行的,但struct成员的更改却出现在lambda之外。struct的指针是否按值捕获?请始终添加语言tag@bolov好的,谢谢通知。请将[=]更改为[&]。您希望使用对变量的引用,而不是它们的副本。这也可能有助于:->捕获lambda以进一步information@Creepsy请仔细阅读这个问题。我只是想知道,为什么尽管lambda捕获是按值进行的,但struct成员的更改却出现在lambda之外。struct的指针是否按值捕获?请始终添加语言tag@bolov好的,谢谢您的通知。已弃用,编译器可能会在不久的将来发出警告,如果他们尚未发出警告,例如,gcc在c++20模式下投诉:已弃用,编译器可能会在不久的将来发出警告,如果他们尚未发出警告,例如,gcc在c++20模式下投诉: