当我想要捕捉外面的东西时,无法编译lambda

Con*_*ney 3 c++ lambda compilation c++11

当我想要捕获lambda之外的东西时,会发生编译错误.这是代码:

int caller(int (*callback)(void *arg), void * arg = NULL) {
  return callback(arg);
}

int main(int argc, char **argv) {

  const char *str = "world";
  caller([&](void *arg) {
      printf("hello %s\n", str);
      return 0;
  }, NULL);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我printf像这样更改内部lambda(不使用外部变量),这是可以的:

printf("hello %s\n", str)
Run Code Online (Sandbox Code Playgroud)

我尝试使用apple g ++ 4.2和gnu g ++ 4.6编译源代码

W.B*_*.B. 8

Lambdas只有在状态时才能转换为函数指针,即没有定义捕获.

看看这里,阅读ClosureType::operator ret(*)(params)()

编辑:

如果您需要定义回调参数,请使用它来定义它std::function,它可以使用任何类型的可调用对象,包括lambdas.看下面,它应该编译好(#include <functional>虽然).

int caller(std::function<int(void*)> callback, void * arg = NULL) {
  return callback(arg);
}
Run Code Online (Sandbox Code Playgroud)

如果你不能改变回调,那么你应该str将第二个参数传递给回调并在lambda中打印出来,如下所示:

caller([](void *arg) {
      printf("hello %s\n", (const char*)arg);
      return 0;
  }, str);
Run Code Online (Sandbox Code Playgroud)

(我知道这实际上不会因const const const转换而编译,但你明白我的意思).