通常,C ++ lambda没有捕获should be convertable到c风格的函数指针。不知何故,使用std::function::target
转换它不起作用(即返回nullptr),target_type
也与签名类型不匹配,即使它看起来是相同的。
在VC13和GCC 5.3 / 5.2.0 / 4.8上测试
最小测试示例:
#include <functional>
#include <iostream>
void Maybe() {
}
void callMe(std::function<void()> callback) {
typedef void (*ftype)();
std::cout << (callback.target_type() == typeid(ftype)) << std::endl;
std::cout << callback.target<ftype>() << std::endl;
}
int main() {
callMe([] () {});
callMe(Maybe);
}
预期输出
1
<address>
1
<address>
实际输出
0
0
1
<address>
问题是:为什么lambda的签名与传递的函数不同?
答案 0 :(得分:16)
在你的第一次调用中,std::function
并不打算将lambda衰减为指针,它只是存储它的实际类型(实际上不是void()
)。
你可以通过简单地使用一元std::function
来强制lambda在使用后者构建+
之前衰减成指针:
callMe(+[](){});
// ^