请教一个指针转换问题

2020-03-19 15:35:02 +08:00
 gaoan000

变量 pFun 为一个指向成员函数的指针,类型为 void(Test::*)()

如果把这个指针转换为 int*类型,方法我自己试了出来,但是不明白为什么要这么写 int *pInt = (int *&)pFun;

按我的理解,转换应该为(int *)pFun,可以帮忙解惑下吗?

2069 次点击
所在节点    C++
6 条回复
wutiantong
2020-03-19 15:38:14 +08:00
你怎么写都是 ub 呀
gaoan000
2020-03-19 15:50:13 +08:00
@wutiantong 是说我没定义吗, 怕影响篇幅没人看

class Test{
public:
void fun1(){
cout << 123 << endl;
}
};

typedef void (Test::*pMember)();
pMember pFun = &Test::fun1;
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 & 的任何操作,所有读取或修改都不会被编译。
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 )规则允许(见下文)时,结果指针才可以安全地解引用
gaoan000
2020-03-19 16:51:18 +08:00
@yulon
@wutiantong
感谢两位的解答,被 C++的一些规则绕进去了.非常感谢
Wirbelwind
2020-04-18 14:28:23 +08:00
2 级的转换可以让编译器检测不到这个行为。

仅仅*是一级 *&是二级

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654270

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX