【发布时间】:2016-10-09 03:46:05
【问题描述】:
我希望能够在 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的推演规则与模板推演非常相似。在这里你有扣除和转换:你只能有一个。 -
我想将问题标题更改为“为什么 auto * 不能从 lambda 推导出函数指针类型?”为了使它成为一个具体的问题。这似乎就是让你困惑的地方。但是您是否更喜欢“如何在不编写类型的情况下从 lambda 获取函数指针?”
-
第一个标题听起来不错。