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

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

最佳答案

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

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

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

关于c++ - 存储在 std::function 中时,无捕获 lambda 无法转换为函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34768791/

相关文章:

c++ - 计算给出最大值的 30 位整数的移位数

c++ - 什么时候在 C++ 中释放变量占用的空间?

c++ - 静态链接库时对 std::*something* 的 undefined reference

Java - 我是否正确地读取了该文件中的文本?

JavaScript 属性访问 : dot notation vs. 括号?

c++ - 显式默认/删除的函数可以在 ref 限定符上重载吗?

c++ - 通过字符串进行最优迭代

c++ - 单步构建目标时如何预编译头文件?

c++ - 如何从成员函数指针中删除 const 限定符

mysql - MySQL 中的 WHILE 语法错误