当static_cast和reinterpret_cast具有相同的效果时,使用哪一个?

sha*_*oth 0 c++ winapi casting

可能重复:
在将void*转换为任何内容时,我应该使用static_cast还是reinterpret_cast

通常,特别是在Win32编程中,需要从一个opaque类型转换为另一个opaque类型.例如:

 HFONT font = cast_here<HFONT>( ::GetStockObject( SYSTEM_FONT ) );
Run Code Online (Sandbox Code Playgroud)

static_cast和reinterpret_cast都适用于此并且具有完全相同的效果,因为HFONT是指向用于定义HFONT的虚拟结构的指针,而GetStockObject()返回的HGDIOBJ是一个void*指针.

哪一个 - static_cast或reinterpret_cast - 更可取?

Ric*_*den 15

说明演员表具有相同的效果是不正确的.演员表演两件完全不同的事情:

  • static_cast<T>(x)说表达式转换x为类型T.
  • reinterpret_cast<T*>(&x) 说将内存位置'&x'解释为T*

考虑以下:

struct A1 { int a1; };
struct A2 { int a2; };
struct B : public A1, public A2 {};

void foo (A1 * a1, A2 * a2)
{
  B * b1_a1 = static_cast<B*> (a1);
  B * b2_a1 = reinterpret_cast<B*> (a1);
  B * b1_a2 = static_cast<B*> (a2);
  B * b2_a2 = reinterpret_cast<B*> (a2);

  std::cout << "b1_a1==b1_a2" << (b1_a1==b1_a2) << std::endl;
  std::cout << "b2_a1==b2_a2" << (b2_a1==b2_a2) << std::endl;
}

int main ()
{
  B b;
  foo (&b, &b);
}
Run Code Online (Sandbox Code Playgroud)

该程序产生以下输出:

g++ -o t t.cc ; ./t
b1_a1==b1_a2: 1
b2_a1==b2_a2: 0
Run Code Online (Sandbox Code Playgroud)

这提供了如何static_casta2b2正确调整指针,以便它指向的开头b,但reinterpret_cast没有.


Sal*_*gar 12

static_cast总是比较好,reinterpret_cast除非绝对必要,否则不要做.

reinterpret_cast 是最不安全的演员阵容.

有关此网站应该使用哪些演员表的更多信息.

  • 我讨厌这种一揽子声明,但事实并非如此.static_cast仅在进行应该用于的转换时才是优选的.reinterpret_cast应该用于所有危险的强制转换,以便您可以快速在代码中找到它们.两种指针类型之间的转换(如果它们不相关)是reinterpret_cast操作.如果存在关系,那么static_cast可能更合适.在这个问题的上下文中,我将使用reinterpret_cast,因为你从void*中进行转换.使用reinterpret_cast是一种很好的方式,可以指出这是一个潜在危险的演员(它是). (7认同)