Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按值捕获lambda_C++_C++17 - Fatal编程技术网

C++ 按值捕获lambda

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

我在structbaz中定义了一个lambda,它通过值捕获struct的实例。所以我希望,若修改发生在lambda主体中的struct成员上,它不会出现在lambda之外,而是会出现。 此外,我在struct之外的函数中定义了一个lambda,该函数通过复制捕获struct,并按照我的预期执行。 能否请您澄清一下lambda在struct内部发生了什么

 #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模式下投诉: