使用reinterpret_cast
将指向成员函数的指针转换为同一个类的另一个指向成员函数是否合法?以下示例有效。但这是合法的吗?
#include<iostream>
#include<vector>
#include<string>
class A
{
public:
void func_int(int x) { std::cout << x << std::endl; }
void func_string(std::string const& x) { std::cout << x << std::endl; }
};
int main()
{
std::vector<void(A::*)()> v;
v.push_back(reinterpret_cast<void(A::*)()>(&A::func_int));
v.push_back(reinterpret_cast<void(A::*)()>(&A::func_string));
A a;
(a.*reinterpret_cast<void(A::*)(int)>(v[0]))(5);
(a.*reinterpret_cast<void(A::*)(std::string const&)>(v[1]))(std::string{"Test"});
return 0;
}
答案 0 :(得分:10)
在[expr.reinterpret.cast],C ++草案声明:
类型“指向类型为
X
的{{1}}成员的指针”的prvalue可以显式转换为不同类型的prvalue“指向T1
类型Y
成员的指针1}}“如果T2
和T1
都是函数类型或两种对象类型。 72 null成员指针值([conv.mem])被转换为null目标类型的成员指针值。除以下情况外,此转换的结果未指定:
将“指向成员函数的指针”类型的prvalue转换为指向成员函数类型的不同指针,并返回其原始类型,从而生成指向成员值的原始指针。
将“指向
T2
类型X
的数据成员”类型的prvalue转换为类型为“{1}}T1
数据成员的指针” }“(Y
的对齐要求不比T2
更严格,并且返回其原始类型会产生指向成员值的原始指针。
72)
T2
和T1
可能有不同的 cv - 限定符,但受T1
无法抛弃常量的总体限制。
因为您正在将&#34;指针转换为成员函数&#34;指向成员函数&#34;的另一个&#34;指针输入和返回,它产生原始值。这是合法且定义明确的行为。所以你的代码应该正常工作。