将函数指针分配给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()
是等效的*函数,但您在此不做任何事情。
*嗯,它甚至不是等效的,因为它是成员函数!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句