Saya mengalami beberapa kesulitan menulis tangkapan yang valid untuk ekspresi lambda yang agak sederhana. Berikut adalah kode yang saya coba kompilasi:

#include <iostream>
#include <vector>

class State { public:
    int i;
    float f;
    State(int i,float f){this->i = i; this->f = f;}
};

typedef State (*FunctionType)(const State &state);


int main(int argc, char **argv)
{
    std::vector<FunctionType> funcs;

    funcs.push_back(
        [](const State &state)
        {
            return State(state.i+7,state.f-3.5);
        });

    State s(100,5.5);

    int m = 5;

    funcs.push_back(
        [](const State &state)
        // [=](const State &state)
        // [&](const State &state)
        {
            return State(m,m+0.5);
        });

    for (auto func : funcs)
    {
        std::cout << func(s).i << " " << func(s).f << "\n";
    }

    return 0;
}

Ketika saya mengkompilasinya dengan

$ g++ -std=c++17 main.cpp -o main

Saya mendapatkan kesalahan berikut (dan lebih banyak lagi) yang menunjukkan bahwa saya tidak dapat menangkap m:

main.cpp: In lambda function:
main.cpp:32:17: error: ‘m’ is not captured
    return State(m,m+0.5);
                 ^
main.cpp:28:4: note: the lambda has no capture-default
   [](const State &state)
    ^
main.cpp:25:6: note: ‘int m’ declared here
  int m = 5;
      ^
0
OrenIshShalom 19 September 2019, 17:51

1 menjawab

Jawaban Terbaik

Anda memang membutuhkan salah satu versi komentar Anda untuk menangkap m

  • [=](const State &state) { return State(m, m + 0.5); }
  • [&](const State &state) { return State(m, m + 0.5); }

Atau tangkapan eksplisit:

  • [m](const State &state) { return State(m, m + 0.5); }
  • [&m](const State &state) { return State(m, m + 0.5); }

Tetapi kemudian Anda memiliki masalah dengan:

std::vector<FunctionType> funcs;

funcs.push_back([=](const State &state) { return State(m, m + 0.5); })

Menangkap lambda tidak dapat membusuk ke penunjuk fungsi, Anda perlu mengubah

typedef State (*FunctionType)(const State &state);

Ke

using FunctionType = std::function<State(const State&)>;

Yang dapat menangani lambda

3
Jarod42 19 September 2019, 14:57