【问题标题】:What reinterpret_cast convention is this? is it better than static_cast? [duplicate]这是什么 reinterpret_cast 约定?它比 static_cast 好吗? [复制]
【发布时间】:2013-10-14 12:04:34
【问题描述】:

我正在查看一些提供 c api 的 c++ 包装器代码,我发现有很多 reinterpret_cast static_cast 就足够了,例如:

struct cpp_object{ void foo(){ /* do something */ } };

/* begin: c api */
typedef void c_object;

void foo(c_object *o)
{
    // why this:
    reinterpret_cast<cpp_object *>(o)->foo();
    // instead of just:
    static_cast<cpp_object *>(o)->foo();
}
/* end: c api */

通常我在极少数情况下使用reinterpret_cast,主要与将缓冲区内容强制位强制转换为已知布局和大小类型(已知位于缓冲区内容内)有关。

所以我问这种做法是否有意义或坚持static_cast 会更好。

【问题讨论】:

  • @JohnBartholomew 谢谢

标签: c++ casting coding-style conventions reinterpret-cast


【解决方案1】:

在这种情况下,reinterpret_cast 相当于 static_castcv void*,然后是另一个 static_cast 到目标指针类型。我相信这是对 C++11 的补充,并且在 C++03 中不存在,您必须编写两个 static_casts 才能获得可移植行为。

【讨论】:

  • 但是被接受的 void 指针参数没有任何 cv 限定,所以 const_cast 从来没有必要,static_cast 可以工作。
  • @chico static_cast 可以添加 cv-qualifiers 它只是不能删除它们。在我的示例中,cv void*static_casts 指示为 void*,其中 void 与源指针具有相同的 cv 限定。
  • 是的,我知道,可能你的意思是在第一个 const_cast 之后的 const_cast 但无论如何......参数没有 cv 限定,所以它是无关紧要的。
  • @chico 你把我弄丢了。 reinterpret_cast&lt;cpp_object*&gt;(o) 等价于 static_cast&lt;cpp_object*&gt;(static_cast&lt;void*&gt;(o))reinterpret_cast 中不涉及 const_cast
  • 好的,但是,正如我想说的。 o 已经只是 void * 不是吗?该演员阵容中没有简历重新资格。这就是我想说的,但是,无论如何,现在我要问了,第一次转换似乎是不必要的,除非它变成了这样,因为我正在处理指向 void 的 typedef 指针?
【解决方案2】:

我认为在这种情况下你必须使用reinterpret_cast,因为c_object的类型是void, 所以o 属于void *。编译器猜不出o 是。它必须是运行时演员表。

【讨论】:

  • 你错了,它只是从 void * 转换为其他指针,这是允许的。
猜你喜欢
  • 2016-05-28
  • 2011-10-14
  • 2021-11-10
  • 2012-02-26
  • 2017-05-10
  • 1970-01-01
  • 2012-09-27
  • 2014-02-12
  • 2011-09-05
相关资源
最近更新 更多