c++ - 获取指向 lambda 的函数指针?

标签 c++ c++11 lambda c++14

我希望能够在 C++ 中获得指向 lambda 的函数指针。

我能做到:

int (*c)(int) = [](int i) { return i; };

而且,当然,以下工作 - 即使它没有创建函数指针。

auto a = [](int i) { return i; };

但是如下:

auto *b = [](int i) { return i; };

在 GCC 中给出这个错误:

main.cpp: In function 'int main()':
main.cpp:13:37: error: unable to deduce 'auto*' from '<lambda closure object>main()::<lambda(int)>{}'
     auto *b = [](int i) { return i; };
                                      ^
main.cpp:13:37: note:   mismatched types 'auto*' and 'main()::<lambda(int)>'

似乎可以毫无问题地将 lambda 转换为函数指针,但编译器无法推断函数类型并使用 auto * 创建指向它的指针。尤其是当它可以将 unique, lambda type 隐式转换为函数指针时:

int (*g)(int) = a;

我在 http://coliru.stacked-crooked.com/a/2cbd62c8179dc61b 创建了一个小测试台包含上述示例。这种行为在 C++11 和 C++14 下是一样的。

最佳答案

这失败了:

auto *b = [](int i) { return i; };

因为 lambda 不是指针。 auto 不允许转换。即使 lambda 可以转换为指针,但这不会为您完成 - 您必须自己完成。是否带类型转换:

auto *c = static_cast<int(*)(int)>([](int i){return i;});

或使用 some sorcery :

auto *d = +[](int i) { return i; };

关于c++ - 获取指向 lambda 的函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709874/

相关文章:

c++ - 错误 : cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’

c++ - 从多重继承中确定模板包

c++ - 如何帮助编译器推导模板参数?

c++ - 将 vector 从一类转换为另一类 vector

c++ - std::ofstream 是否保证打开新文件时将关闭旧的打开文件?

c++11 - 无法将 std::chrono::duration 与零进行比较

c++ - 在 Python 中,你如何像 C++ 一样获取标记化输入?

c++ - 为什么 `explicit` 与 `virtual` 不兼容?

Java Lambda 表达式和对象方法引用

c# - 如何在 C# 中使用 lambda 表达式进行嵌套 where 查询