void 指针可以指向 lambda 函数吗?
Can a void pointer point to a lambda function?
将函数指针分配给 void
指针,
double f_dummy(double x) { return x; }
...
void *pv = f_dummy; //compilation error
如本 FAQ 中所述是非法的。然而,答案以声明结束:
如果以上内容似乎适用于您特定操作系统上的特定编译器的特定版本,请不要给我发电子邮件。我不在乎。这是非法的,期间。
Edit :作为对其他人的警告,我确实遇到过这种“似乎有效”的行为,通过涉及继承的案例class 个模板。没有编译器警告,没有意外的 运行 时间行为。
这让我的 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
是一个对象(一个函子,具有未指定的 class 类型)——这就是 lambda 的实现方式,按照标准要求。
您引用的常见问题解答文本无关,因为它指的是指向 函数 的指针。 _yourUnspecifiedLambdaType::operator()
是等效的*函数,但您在这里没有做任何事情。
* 好吧,它甚至不等价,因为它是一个 member 函数!
将函数指针分配给 void
指针,
double f_dummy(double x) { return x; }
...
void *pv = f_dummy; //compilation error
如本 FAQ 中所述是非法的。然而,答案以声明结束:
如果以上内容似乎适用于您特定操作系统上的特定编译器的特定版本,请不要给我发电子邮件。我不在乎。这是非法的,期间。
Edit :作为对其他人的警告,我确实遇到过这种“似乎有效”的行为,通过涉及继承的案例class 个模板。没有编译器警告,没有意外的 运行 时间行为。
这让我的 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
是一个对象(一个函子,具有未指定的 class 类型)——这就是 lambda 的实现方式,按照标准要求。
您引用的常见问题解答文本无关,因为它指的是指向 函数 的指针。 _yourUnspecifiedLambdaType::operator()
是等效的*函数,但您在这里没有做任何事情。
* 好吧,它甚至不等价,因为它是一个 member 函数!