将函数指针分配给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;

真正可以合法编译和运行(g++ -std=c++11 -Wall)。是吗?

最佳答案

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

指向对象的

  • 指针可以转换为void*并再次返回;
  • l_func是一个对象(仿函数,具有未指定的类类型),这是通过标准任务实现lambda的方式。

  • 您引用的FAQ文本是无关的,因为它是指向函数的指针。 _yourUnspecifiedLambdaType::operator()是等效的*函数,但是您在此处不执行任何操作。

    *嗯,它甚至不是等效的,因为它是成员函数!

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

    10-09 19:53
    查看更多