gpt4 book ai didi

c++ - 我认为 static_cast() 等同于 C++ 中的 TYPE(variable)?

转载 作者:搜寻专家 更新时间:2023-10-30 23:56:46 25 4
gpt4 key购买 nike

我刚遇到一些我不太明白的事情。我以为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");

我的编译器说它不能从 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");

我错过了什么?

最佳答案

I thought that static_cast<TYPE>(variable) was equivalent (or better/safer) than TYPE(variable).

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

If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).

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

The conversions performed by

  • a const_cast (5.2.11),
  • a static_cast (5.2.9),
  • a static_cast followed by a const_cast,
  • a reinterpret_cast (5.2.10), or
  • a reinterpret_cast followed by a const_cast,

can be performed using the cast notation of explicit type conversion.

(请注意,有一个额外的文本解释了有关类层次结构的一些差异,这在这里不是很相关。)
在你的情况下,static_cast不够。 reinterpret_cast会,因为它可以将整数转换为指针,反之亦然。 reinterpret_cast的原因之一那么应该首选是例如通过搜索具有潜在危险的类型转换而被发现的能力。有关何时使用两者的更多查询,请参阅 this question .

关于c++ - 我认为 static_cast<TYPE>() 等同于 C++ 中的 TYPE(variable)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27135677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com