无捕获 lambda 存储在 std::function 中时无法转换为函数指针
Captureless lambda cannot be converted to function pointer when stored in std::function
通常,没有捕获 到 c 风格函数指针的 C++ lambda。不知何故,使用 std::function::target
转换它不起作用(即 returns 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 的签名与传递的函数不同?
在您的第一次调用中,std::function
不会将 lambda 衰减为指针,它只是将其存储为实际类型(确实不是 void()
)。
您可以强制 lambda 衰减为指针 before 通过简单地使用一元 +
:[=15 用后者构造 std::function
=]
callMe(+[](){});
// ^
通常,没有捕获 std::function::target
转换它不起作用(即 returns 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 的签名与传递的函数不同?
在您的第一次调用中,std::function
不会将 lambda 衰减为指针,它只是将其存储为实际类型(确实不是 void()
)。
您可以强制 lambda 衰减为指针 before 通过简单地使用一元 +
:[=15 用后者构造 std::function
=]
callMe(+[](){});
// ^