当一个人想要存储指向具有不同签名的函数的指针时,可以将它们转换为void(*)()
(或任何其他函数指针类型),然后在调用之前将它们转换回原始类型,afaik C++ 保证这种往返工作。但是成员函数指针呢?是否有任何保证通过另一个不同类型的成员函数指针(可能是不同类的成员函数)往返成员函数指针不会破坏某些东西?
2 回答
是的,reinterpret_cast
指向成员类型之间的往返保证是有效的,只要在这两种情况下都保持它指向数据成员或指向成员函数的指针。
引用 C++11:
[expr.reinterpret.cast]
10如果和都是函数类型或都是对象类型,则“指向类型成员的指针”
X
类型T1
的纯右值可以显式转换为不同类型的“指向类型成员的指针”类型的纯右值Y
。空成员指针值 (4.11) 被转换为目标类型的空成员指针值。此转换的结果未指定,但以下情况除外:T2
T1
T2
- 将“指向成员函数的指针”类型的纯右值转换为指向成员函数类型的不同指针并返回其原始类型会产生指向成员值的原始指针。
我认为是这样reinterptret_cast
。这就是标准所说的 (5.2.11/10)
如果 T1 和 T2 都是函数类型或都是对象类型,则“指向 T1 类型 X 成员的指针”类型的纯右值可以显式转换为不同类型“指向 T2 类型 Y 成员的指针”的纯右值。 71空成员指针值 (4.11) 转换为目标类型的空成员指针值。此转换的结果未指定,但以下情况除外:
— 将“指向成员函数的指针”类型的纯右值转换为指向成员函数类型的不同指针并返回其原始类型会产生指向成员值的原始指针。
— 将“指向 T1 类型 X 的数据成员的指针”类型的纯右值转换为“指向 T2 类型的 Y 数据成员的指针”类型(其中 T2 的对齐要求不比 T1 严格)并返回其原始类型产生指向成员值的原始指针。