gpt4 book ai didi

c++ - 当我想在外面抓东西时无法编译 lambda

转载 作者:太空狗 更新时间:2023-10-29 20:04:02 27 4
gpt4 key购买 nike

当我想捕捉 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 就没问题(不使用外部变量):

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

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

最佳答案

Lambda 只能在无状态时转换为函数指针,即没有定义捕获。

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

编辑:

如果由您来定义回调参数,请使用 std::function 来定义它,它可以采用任何类型的可调用对象,包括 lambda。看下面,应该是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 转换,这实际上不会编译,但你明白我的意思)。

关于c++ - 当我想在外面抓东西时无法编译 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22982912/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com