存储在std :: function中时,无捕获的lambda无法转换为函数指针

时间:2016-01-13 14:07:39

标签: c++ c++11 syntax lambda function-pointers

通常,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的签名与传递的函数不同?

1 个答案:

答案 0 :(得分:16)

在你的第一次调用中,std::function并不打算将lambda衰减为指针,它只是存储它的实际类型(实际上不是void())。

你可以通过简单地使用一元std::function来强制lambda在使用后者构建+之前衰减成指针

callMe(+[](){});
//     ^