捕获打破了我的lambda函数

pac*_*_uk 7 c++ lambda c++11

我有一个函数getTotal:

int getTotal( const HitMap& hitMap, bool( *accept)(int chan) )
Run Code Online (Sandbox Code Playgroud)

其中第二个参数是bool函数,指定应将容器hitMap的哪些成员添加到总数中.

我试着用lambda来调用它.这有效:

auto boxresult =
getTotal(piHits, [](int pmt)->bool
{ return (pmt/100) == 1;} );
Run Code Online (Sandbox Code Playgroud)

但这不是:

int sector = 100;
auto boxresult =
getTotal(piHits, [sector](int pmt)->bool
{ return (pmt/sector) == 1;} );
Run Code Online (Sandbox Code Playgroud)

我收到了错误

cannot convert ‘main(int, char**)::<lambda(int)>’ to ‘bool (*)(int)’
for argument ‘2’ to ‘int getTotal(const HitMap&, bool (*)(int))’
Run Code Online (Sandbox Code Playgroud)

来自我的编译器(GCC 4.6.3).我尝试过[&sector],[=sector]但没有任何区别.

我究竟做错了什么?

hmj*_*mjd 16

当lambda具有capture子句时,它不能再被视为函数指针.要更正,请将其std::function<bool(int)>用作参数类型getTotal():

int getTotal( const HitMap& hitMap, std::function<bool(int)> accept)
Run Code Online (Sandbox Code Playgroud)

  • @paco_uk:原因是当你的lambda没有捕获任何数据时,为了调用它,计算机只需要知道代码的存储位置.这意味着函数指针可用于指向代码.当您的lambda捕获数据时,它需要知道代码的存储位置,并且还要知道数据值是什么.这不能全部存储在函数指针中,因此在幕后创建仿函数,并且该仿函数具有不同的类型,因为它存储不同的数据. (5认同)
  • 或者......模板. (4认同)