[英]I thought static_cast<TYPE>() was equivalent to TYPE(variable) in C++?
我刚看到一些我不太了解的东西。 我以为static_cast<TYPE>(variable)
)比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");
我的编译器说它无法从HMENU
转换为intptr_t
。 我有一个64位系统顺便说一句,它干扰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");
我错过了什么?
我以为
static_cast<TYPE>(variable)
)比TYPE(variable)
等价(或更好/更安全TYPE(variable)
。
它只是一个子集。 一些转换可以由两者执行,但有些转换只能由后者执行。 对于函数式转换,标准在[expr.type.conv]中指定:
如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(在定义中,如果在含义中定义)。
也就是说, TYPE(variable)
等同于(TYPE)variable
。 现在,对于后者,标准指定
的转换
- 一个
const_cast
(5.2.11),- 一个
static_cast
(5.2.9),static_cast
后跟const_cast,reinterpret_cast
(5.2.10),或- 一个
reinterpret_cast
后跟一个const_cast
,可以使用显式类型转换的强制转换表示法执行。
(请注意,还有另外的文本解释了有关类层次结构的一些差异,此处并不十分相关。)
就您而言, static_cast
。 reinterpret_cast
会,因为它可以将整数转换为指针,反之亦然。 之后应该首选reinterpret_cast
的原因之一是例如通过搜索潜在危险的演员而找到的能力。 有关何时使用两者的进一步查询,请参阅此问题 。
它更安全。 它也较弱。 它更安全,因为它更弱。
static_cast
将执行隐式转换,此外它将向下转换类层次结构。
它还将使用相同的const
volatile
限定符来转换指向/来自void*
的指针。 (我相信它隐含在C中 - 它不在C ++中)。
这些是C / C ++中“更安全”的强制转换集。
const_cast
和reinterpret_cast
获得更危险的。 这些包括将指针值转换为整数,即使整数足够大。
我的建议是编写以下函数:
intptr_t ptr_to_intptr( void* p ) { return reinterpret_cast<intptr_t>(p); }
这使得操作清晰,然后使用它。
与(intptr_t)
不同的是,它仅适用于指针-因此,如果您不小心将其输入了不是指针的内容。 或者指针不能存储在intptr_t
如指向成员的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.