繁体   English   中英

将成员函数指针强制转换为另一类的成员并再次返回是否安全?

[英]Is it safe to cast a member function pointer to one of another class and back again?

阅读该问题的答案( 将函数指针转换为另一种类型 ),我知道将void(*)(A*)的指针转换为void(*)(B*)类的指针是安全的,您只需要在打电话给他们之前先将他们抛弃。

这也适用于成员函数指针吗? 我可以安全地将void(A::*)() void(B::*)()void(B::*)()并在调用之前将其强制转换回来吗?

似乎至少在我的系统上有效的示例代码:

#include <iostream>

struct A {
  void f() { std::cout << "called" << std::endl; }
};

struct B {};

int main() {
  A instance;
  auto ptr = reinterpret_cast<void (B::*)()>(&A::f);
  (instance.*(reinterpret_cast<void (A::*)()>(ptr)))();
}

我相信,是的。 这是我在标准(5.2.10)中找到的内容:

如果T1和T2都是函数类型或都是对象类型,则可以将类型“指向类型T1的X的成员的指针”的prvalue显式转换为类型不同的“指向类型T2的Y的成员的指针”的prvalue。 空成员指针值(4.11)将转换为目标类型的空成员指针值。 除以下情况外,未指定此转换的结果:

—将类型为“指向成员函数的指针”的prvalue转换为指向成员函数类型的不同指针,然后再返回其原始类型,将产生指向成员值的原始指针。

—将类型“指针指向类型T1的X的数据成员”的prvalue转换为类型“指针指向类型T2的Y的数据成员”(其中T2的对齐要求不严格于T1的对齐要求)并返回到其原始类型产生指向成员值的原始指针。

从5.2.10 / 10( reinterpret_cast )我们学习:

如果T1和T2都是函数类型或都是对象类型,则可以将“指向T1类型的X成员的指针”的prvalue显式转换为不同类型“指向T2类型的Y成员的指针”的prvalue。71空成员指针值(4.11)将转换为目标类型的空成员指针值。 除以下情况外,未指定此转换的结果:

  • 将类型“指向成员函数的指针”的prvalue转换为成员函数类型的不同指针,然后再返回其原始类型,将产生指向成员值的原始指针。

在这种情况下,您要在成员函数指针(都指向函数)之间进行转换,因此看起来完全合法。

5.4 [expr.cast]说,您可以使用reinterpret_cast来将派生指针指向基础成员的指针再返回。 当然,您必须转换回派生类型才能使用指针,因为不能保证它指向的函数实际上是基数的成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM