当我想要捕捉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
编译源代码答案 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转换而编译,但是你理解我的意思。)