变量 pFun 为一个指向成员函数的指针,类型为 void(Test::*)()
如果把这个指针转换为 int*类型,方法我自己试了出来,但是不明白为什么要这么写 int *pInt = (int *&)pFun;
按我的理解,转换应该为(int *)pFun,可以帮忙解惑下吗?
1
wutiantong 2020-03-19 15:38:14 +08:00
你怎么写都是 ub 呀
|
2
gaoan000 OP @wutiantong 是说我没定义吗, 怕影响篇幅没人看
class Test{ public: void fun1(){ cout << 123 << endl; } }; typedef void (Test::*pMember)(); pMember pFun = &Test::fun1; |
3
yulon 2020-03-19 16:21:34 +08:00
标准就不想让你转,但大部分实现可以用 *reinterpret_cast<const void *const *>(&mem_ptr) 或 *reinterpret_cast<const uintptr_t *>(&mem_ptr),这是基于内存布局的,用 C++ 尽量不要用 C 式转换,如果要转成 int * 可以把第一条的 void 换成 int,但是根据严格别名规则,编译器可能会忽略你对解引用后的 int & 的任何操作,所有读取或修改都不会被编译。
|
4
wutiantong 2020-03-19 16:27:31 +08:00
@gaoan000
ub 是未定义行为的意思: https://zh.cppreference.com/w/cpp/language/ub 显示类型转换的规则是: https://zh.cppreference.com/w/cpp/language/explicit_cast 你用的是第一类( C 风格转型表达式) 如果要转成(int *),static_cast 和 reinterpret_cast 都帮不了你; 如果要转成(int * &),则会落入 reinterpret_cast 的第六条: https://zh.cppreference.com/w/cpp/language/reinterpret_cast 具体是: 6) T1 类型的左值表达式可转换成到另一个类型 T2 的引用。结果是与原左值指代同一对象,但有不同类型的左值或亡值。不创建临时量,不进行复制,不调用构造函数或转换函数。只有类型别名化( type aliasing )规则允许(见下文)时,结果指针才可以安全地解引用 |
5
gaoan000 OP |
6
Wirbelwind 2020-04-18 14:28:23 +08:00
2 级的转换可以让编译器检测不到这个行为。
仅仅*是一级 *&是二级 |