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

时间:2014-04-10 08:40:35

标签: c++ c++11 compilation lambda

当我想要捕捉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;
}

但如果我像这样更改printf内部lambda(不使用外部变量),那就没关系了:

printf("hello %s\n", str)

我尝试使用apple g ++ 4.2和gnu g ++ 4.6

编译源代码

1 个答案:

答案 0 :(得分:8)

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

查看here并阅读ClosureType::operator ret(*)(params)()

编辑:

如果您需要定义回调参数,请使用std::function来定义它,它可以使用任何类型的可调用对象,包括lambdas。请参阅下文,它应该compile fine#include <functional>)。

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

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

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

(我知道这实际上不会因为const const转换而编译,但是你理解我的意思。)