存储无捕获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
相关产品推荐
相关产品推荐

