C++ Can';当我想在外面抓东西的时候,我不会编译lambda

C++ Can';当我想在外面抓东西的时候,我不会编译lambda,c++,c++11,compilation,lambda,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);

当我想要捕获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;
}
但是,如果我像这样更改lambda内部的
printf
(不使用外部变量),也可以:


我试着用apple g++4.2和gnu g++4.6编译源代码,Lambdas只有在它们是statele时才能转换为函数指针,即没有定义捕获

查看并阅读有关
ClosureType::operator ret(*)(参数)(

编辑:

如果由您定义回调参数,请使用
std::function
定义它,它可以接受任何类型的可调用对象,包括lambda。请参见下文,它应该与它一起使用(
#包括


(我知道由于const-non-const转换,这实际上无法编译,但您明白我的意思)。

请给我们编译器的错误消息。此外,您更改的
printf
实际上没有更改。实际上,我使用的是您描述的第二种方法。有时我想在一些系统api中使用lambda,比如pthread_create,我有很多变量要传递给回调函数。如果我通过一对或元组或其他方式传递所有变量,然后将void*转换为正确的类型,这是非常烦人的。有什么好方法来处理这种情况吗?如果可能的话,您可以将对这些变量的引用包装到某个结构中,并将指向该结构的指针作为回调参数传递。我知道这比捕获要麻烦得多,但有时这是唯一的方法。使用
std::function
void*
,然后将
void*
作为参数传递,会适得其反。您不必要地限制了可以使用的参数。只需使用一个
std::function
,少数拥有
int(void*)
的人仍然可以使用
std::bind
printf("hello %s\n", str)
int caller(std::function<int(void*)> callback, void * arg = NULL) {
  return callback(arg);
}
caller([](void *arg) {
      printf("hello %s\n", (const char*)arg);
      return 0;
  }, str);