You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储无捕获lambda的对象是否拥有自身内存地址?

关于无捕获Lambda与函数指针的疑问解答

1. test2是否存储的是lambda的函数指针?

不是。Lambda的本质是编译器自动生成的匿名类的实例对象,而非函数指针。对于无捕获的Lambda,C++标准允许它隐式转换为对应签名的函数指针,但test2本身仍然是这个匿名类的对象,不是函数指针。

你代码里用printf("%p", test2)时,编译器触发了这个隐式转换,输出的是Lambda的operator()成员函数的地址,看起来像是函数指针,但test2本身还是对象。

2. 为什么&test2输出(nil)?

这是未定义行为导致的错误结果。printf的%p格式符要求参数必须是void*类型,但&test2是Lambda匿名类的指针类型(比如SomeAnonymousType*),直接传递给printf时,类型不匹配,编译器无法正确转换,在Programiz的编译环境中表现为输出(nil)。

要正确打印test2的地址,需要显式将其转换为void*:

printf("%p", static_cast<void*>(&test2));

修改后就能输出test2对象在栈上的正确地址了。另外,无捕获Lambda的匿名类通常是空类(大小为1字节),但它确实拥有自己的内存地址,只是你的代码中打印方式错误导致结果异常。

内容的提问来源于stack exchange,提问作者dustChou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:25:23