【问题标题】:Cast from Void* to TYPE* using C++ style cast: static_cast or reinterpret_cast使用 C++ 样式转换从 Void* 转换为 TYPE*​​:static_cast 或 reinterpret_cast
【发布时间】:2011-03-05 02:50:04
【问题描述】:

因此,如果您从 Void* 转换为 Type* 或从 Type* 转换为 Void*,您应该使用:

void func(void *p)
{
    Params *params = static_cast<Params*>(p);
}

void func(void *p)
{
    Params *params = reinterpret_cast<Params*>(p);
}

对我来说 static_cast 似乎更正确,但我看到两者都用于相同的目的。此外,转换的方向是否重要。即我是否仍应将 static_cast 用于:

_beginthread(func,0,static_cast<void*>(params)

我已阅读有关 C++ 样式转换的其他问题,但我仍然不确定这种情况的正确方法是什么(我认为它是 static_cast)

【问题讨论】:

    标签: c++ casting static-cast reinterpret-cast


    【解决方案1】:

    您应该使用 static_cast 以便正确操作指针以指向正确的位置。但是,只有在首先使用静态强制转换将指针强制转换为 void* 时,才应该这样做。否则,您应该重新解释为与原始指针完全相同的类型(无基等)。

    【讨论】:

      【解决方案2】:

      您应该始终避免使用reinterpret_cast,在这种情况下static_cast 可以胜任。转换为 void* 指针时不需要任何类型的转换。

      【讨论】:

      • 那么为什么要有 reinterpret_cast?有没有应该使用 reinterpre_cast 的情况。其他 3 名演员可以覆盖所有演员吗?
      • 如果 void* 的另一侧将转换为基类,您还需要在分配给 void 之前转换为该基类。
      • @Noah 对此有何参考?
      • 你的意思是除了标准?允许的静态转换及其结果在 5.2.9 (expr.static.cast) 中描述。关于 void* 的段落是 4 和 10。
      • @MartinYork reinterpret_cast 用于在相同大小的不相关类型之间进行转换(例如 intptr_t void*,这不会与 static_cast 或类似类型一起使用)。
      【解决方案3】:

      为此在两边使用static_cast,并保存reinterpret_cast,以备没有其他铸造操作可以使用。以下 SO 主题提供了更多上下文和详细信息:

      What wording in the C++ standard allows static_cast<non-void-type*>(malloc(N)); to work?

      When to use reinterpret_cast?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-04
        • 2021-09-09
        • 1970-01-01
        • 2012-01-08
        • 2013-10-25
        • 2014-08-24
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多