小编Joh*_*son的帖子

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

通常,没有捕获的C++ lambda 应该可以转换为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);
}
Run Code Online (Sandbox Code Playgroud)

预期产量将是

1
<address>
1
<address>
Run Code Online (Sandbox Code Playgroud)

实际产出

0
0
1
<address>
Run Code Online (Sandbox Code Playgroud)

问题是:为什么lambda的签名与传递的函数不同?

c++ syntax lambda function-pointers c++11

15
推荐指数
1
解决办法
659
查看次数

标签 统计

c++ ×1

c++11 ×1

function-pointers ×1

lambda ×1

syntax ×1