【问题标题】:Having issues casting from const void * to template type with LLVM使用 LLVM 从 const void * 转换为模板类型时遇到问题
【发布时间】:2017-11-12 18:12:37
【问题描述】:

我在使用 LLVM 编译以下函数时遇到问题,该函数在 MSVC 中编译得非常好。

template<typename Fn>
Fn GetVFunction(const void *instance, std::size_t index) {
    const auto vtable = *reinterpret_cast<const void***>(const_cast<void*>(instance));
    return reinterpret_cast<Fn>(vtable[index]);
}

出现以下错误:

 "reinterpret_cast from 'const void *' to 'SDK::UObject *(*)(SDK::UClass *)' casts away qualifiers"

我环顾四周,建议执行以下操作-

return const_cast<Fn>(reinterpret_cast<const Fn>(vtable[index]));

这导致了同样的问题。

任何帮助将不胜感激!

【问题讨论】:

  • 你做一个const_cast&lt;void*&gt;(instance)。这个错误你怎么不清楚?
  • 否则,从 'const void *' 到 'const void ***' 的 reinterpret_cast 错误会丢弃限定符。代码前面的基本相同的问题。原来的错误发生在最后一行。
  • 导致了同样的问题”——这是不可能的。向我们展示第二种情况的错误。
  • 我做到了,再次阅读我的消息。 " reinterpret_cast 从 'const void *' 到 'const void ***' 抛弃限定符" 代码: const auto vtable = *reinterpret_cast(instance);
  • const auto vtable = *reinterpret_cast&lt;const void***&gt;(const_cast&lt;void*&gt;(instance)); 你认为vtable 在这行之后应该是什么?

标签: c++ templates casting llvm void-pointers


【解决方案1】:

由于模板实例化时出现问题,您的错误无法重现,但我认为以下应该可行

template<typename Fn>
Fn GetVFunction(const void *instance, std::size_t index) {
    auto vtable = reinterpret_cast<void**>(const_cast<void*>(instance));
    return reinterpret_cast<Fn>(vtable[index]);
}

请注意,void* 操作通常是 C++ 中编码不佳的标志(因为它容易出错),但在 C 中很常见(缺乏类型安全的泛型编程)

【讨论】:

  • instance 需要取消引用,所以我将其更改为 *reinterpret_cast ,这似乎有效。尝试您的解决方案后,我现在看到了错误。我猜 LLVM 不喜欢对 const void* 执行 reinterpret_cast,在这种情况下,没有必要。
  • @TJ8 您似乎仍然没有理解原始错误。当您尝试将 const 转换为非 const 指针时,LLVM 抱怨第二个 reinterpret_cast。 MSVC 允许这是一个 BUG。
猜你喜欢
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多