繁体   English   中英

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

[英]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_castreinterpret_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM