Незаконный захват в лямбда-выражении в c ++ - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть некоторые трудности при написании правильного захвата для довольно простого лямбда-выражения.Вот код, который я пытаюсь скомпилировать:

#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;
}

Когда я компилирую его с

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

, я получаю следующую ошибку (и более), указывающую, что я не смогзахватить 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;
      ^

1 Ответ

3 голосов
/ 19 сентября 2019

Вам действительно нужна одна из ваших закомментированных версий для захвата m

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

или явного захвата:

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

Но тогда у вас возникли проблемы с:

std::vector<FunctionType> funcs;

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

Захват лямбды не может затухатьчтобы функционировать указатель, вам нужно изменить

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

на

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

, который может обрабатывать лямбда

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...