【问题标题】:Odd casting issue奇怪的铸造问题
【发布时间】:2020-09-17 06:51:44
【问题描述】:

奇怪的转换问题

为了节省时间,我将直接跳到问题。

虽然在我的一个返回函数中,我通过使用这样的语句来设置引用:

示例:using T = int( __thiscall* )( void* );

现在,在这个语句中,我有一个返回值,它会从返回引用类型指针中收集一个偏移量:

示例:return ( *reinterpret_cast< T** >( this ) )[0X0]( this );

当我使用我的 using 语句使用引用时,操作返回成功,我的函数将正常工作。但是,当不使用该语句并评估参考本机时,我的编译器会向我抛出一些标记,说明它无法处理。

我正在尝试做的示例:return ( *reinterpret_cast< int( __thiscall* )( void* )** >( this ) )[0X0]( this );

是我遗漏了什么,还是这不可能?

【问题讨论】:

  • 是什么让this 变成T** 成为可能?为什么 this 是一个指向函数指针的指针? (不是说错,只是说明一个解释会让一切更清楚)
  • 哦,这些都是类内部的设置返回,看起来像:class example { function_example( ) { reference;返回; });

标签: c++ pointers casting reinterpret-cast


【解决方案1】:

作为纯粹的语法问题并且没有深入研究为什么你这样做,指针到指针到指针到函数的语法是增加@的数量987654322@ 限定词,你通常只放一个:

return ( *reinterpret_cast< int( __thiscall*** )( void* ) >( this ) )[0X0]( this );
                                           ^^^

而不是仅仅在最后加上它们——这适用于类型别名,但不适用于多级函数指针类型。

【讨论】:

  • prntscr.com/sq78lk 是的,你是对的。我很困惑。谢谢!
  • 我有一种预感,这实际上是 UB。读取对象的 v-table 并返回第 n 个条目。该标准提供零保证,这将始终有效。另外,我猜,让 OP 成为三星级程序员;-)
猜你喜欢
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 2021-01-16
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多