我以为static_cast <TYPE>()相当于C++中的TYPE(变量)?

jen*_*nsa 2 c++ casting

我刚看到一些我不太了解的东西.我认为这static_cast<TYPE>(variable)相当于(或更好/更安全)TYPE(variable).但是,以下代码不起作用

HMENU hMenu = CreateMenu();
HMENU hSubMenu = CreatePopupMenu();

// File
AppendMenu(hSubMenu, MF_STRING, WndClass_main::ID_FILE_EXIT, "&Quit");
AppendMenu(hMenu, MF_STRING | MF_POPUP, static_cast<intptr_t>(hSubMenu), "&File");
Run Code Online (Sandbox Code Playgroud)

我的编译器说它无法转换HMENUintptr_t.我有一个64位系统顺便说一句,这与间铸造interfers void*int?但是,根据我的理解,类型intptr_t(在cstdint中定义)保证足够大void*.

有趣的是,以下(注意不同的演员)有效:

HMENU hMenu = CreateMenu();
HMENU hSubMenu = CreatePopupMenu();

// File
AppendMenu(hSubMenu, MF_STRING, WndClass_main::ID_FILE_EXIT, "&Quit");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (intptr_t)(hSubMenu), "&File");
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Col*_*mbo 5

我认为这static_cast<TYPE>(variable)相当于(或更好/更安全)TYPE(variable).

它只是一个子集.一些转换可以由两者执行,但有些转换只能由后者执行.对于函数式转换,标准在[expr.type.conv]中指定:

如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(在定义中,如果在含义中定义).

也就是说,TYPE(variable)相当于(TYPE)variable.现在对于后者,标准规定

由...执行的转换

  • a const_cast(5.2.11),
  • a static_cast(5.2.9),
  • a static_cast后跟const_cast,
  • a reinterpret_cast(5.2.10),或
  • a reinterpret_cast后跟一个const_cast,

可以使用显式类型转换的强制转换表示法执行.

(请注意,还有一个附加文本解释了有关类层次结构的一些差异,这在这里并不十分相关.)
在您的情况下,static_cast还不够.reinterpret_cast会,因为它可以将整数转换为指针,反之亦然.其中一个原因reinterpret_cast应该是首选的是例如通过搜索潜在危险的演员而找到的能力.有关何时使用两者的进一步查询,请参阅此问题.