请教一个指针转换问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gaoan000
V2EX    C++

请教一个指针转换问题

  •  
  •   gaoan000 2020-03-19 15:35:02 +08:00 2446 次点击
    这是一个创建于 2036 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    6 条回复    2020-04-18 14:28:23 +08:00
    wutiantong
        1
    wutiantong  
       2020-03-19 15:38:14 +08:00
    你怎么写都是 ub 呀
    gaoan000
        2
    gaoan000  
    OP
       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
        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 & 的任何操作,所有读取或修改都不会被编译。
    wutiantong
        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 )规则允许(见下文)时,结果指针才可以安全地解引用
    gaoan000
        5
    gaoan000  
    OP
       2020-03-19 16:51:18 +08:00
    @yulon
    @wutiantong
    感谢两位的解答,被 C++的一些规则绕进去了.非常感谢
    Wirbelwind
        6
    Wirbelwind  
       2020-04-18 14:28:23 +08:00
    2 级的转换可以让编译器检测不到这个行为。

    仅仅*是一级 *&是二级
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     904 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 20:46 PVG 04:46 LAX 13:46 JFK 16:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86