存储在std::function中时,无法将无CaptureLambda转换为函数指针 通常是一个C++的lambda,没有捕获到C样式函数指针。不知何故,使用std::function::target转换它不起作用(即返回null ptr),而且target_类型与签名类型不匹配,即使它看起来是相同的
在VC13和GCC 5.3/5.2.0/4.8上测试 最小测试示例:存储在std::function中时,无法将无CaptureLambda转换为函数指针 通常是一个C++的lambda,没有捕获到C样式函数指针。不知何故,使用std::function::target转换它不起作用(即返回null ptr),而且target_类型与签名类型不匹配,即使它看起来是相同的,c++,c++11,syntax,lambda,function-pointers,C++,C++11,Syntax,Lambda,Function Pointers,在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(fty
#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);
}
#包括
#包括
可能无效{
}
void callMe(std::函数回调){
typedef void(*ftype)();
std::cout在您的第一次调用中,std::function
不需要将lambda分解成指针,它只是将lambda与其实际类型(实际上不是void()
)一起存储
只需使用一元+
,就可以在使用后者构造std::函数之前,强制lambda衰减为指针:
callMe(+[](){});
// ^
“…应可转换为…”-需要引用。@Hmmm,.@πάνταῥεῖ 谢谢,我把它包括在问题+1中,但是:我真的不喜欢这种整型/指针型强制的+
破解。它太模糊了意图。最好通过将其包装到专用函数中来明确它。因此我们发现了一个?@πάντα的副本ῥεῖ 它们并不是严格重复的(其他的是关于类型推断和重载解析),但它们确实有很强的相关性。@KonradRudolph我想这是一个习惯的问题。将它隐藏在衰减(T&&)
函数后面也不会让我感到困扰。
0
0
1
<address>
callMe(+[](){});
// ^