gpt4 book ai didi

c++ - c++ lambda表达式中的非法捕获

转载 作者:行者123 更新时间:2023-11-27 23:37:45 25 4
gpt4 key购买 nike

我在为相当简单的 lambda 表达式编写有效捕获时遇到了一些困难。这是我要编译的代码:

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

最佳答案

您确实需要您的评论版本之一来捕获 m

  • [=](const State &state) { 返回状态(m, m + 0.5); }
  • [&](const State &state) { 返回状态(m, m + 0.5); }

或显式捕获:

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

但是你有以下问题:

std::vector<FunctionType> funcs;

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

捕获lambda不能衰减到函数指针,需要改

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

进入

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

可以处理lambda

关于c++ - c++ lambda表达式中的非法捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58013750/

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