void指针可以指向lambda函数吗?

时间:2015-12-14 13:46:36

标签: c++ c++11 lambda void-pointers

void指针分配函数指针

double f_dummy(double x) { return x; }
...
    void *pv = f_dummy;  //compilation error

是非法的,如FAQ中所述。然而,答案以声明结束:

如果上述内容似乎适用于特定操作系统上特定版本的特定编译器,请不要给我发电子邮件。我不在乎。这是非法的,期间。

修改:作为对他人的警告,我确实遇到了这个" 似乎正常工作"行为,通过涉及类模板的继承的情况。没有编译器警告,没有意外的运行时行为。

这让我的OCD骨头发痒,让我想知道我做了什么,例如,

...
    auto l_func = [](double x){ return f_dummy(x); };
    void *pv = &l_func;
    auto pl = static_cast<decltype(&l_func)>(pv);
    cout << (*pl)(5.) << endl; 
编译和运行干净(<{1}})的

是真正合法的。是吗?

1 个答案:

答案 0 :(得分:15)

是的,这是合法的,因为:

  • 指向对象的指针可以转换为void*然后再转发回来;
  • l_func是一个对象(一个仿函数,具有未指定的类类型) - 这是按照标准授权实现lambdas的方式。

您引用的FAQ文本是无关的,因为它引用了指向函数的指针。 _yourUnspecifiedLambdaType::operator()是等效的*函数,但您在这里没有做任何事情。

* 嗯,它甚至不等同,因为它是成员的功能!

相关问题