我刚看到一些我不太了解的东西.我认为这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)
我的编译器说它无法转换HMENU为intptr_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)
我错过了什么?
我认为这
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应该是首选的是例如通过搜索潜在危险的演员而找到的能力.有关何时使用两者的进一步查询,请参阅此问题.