将指针转换为LPVOID *

时间:2015-04-23 10:49:27

标签: c++ pointers casting reinterpret-cast static-cast

我有以下代码:

IShellLink* psl;
HRESULT hres = CoCreateInstance(
    CLSID_ShellLink, 
    NULL, 
    CLSCTX_INPROC_SERVER, 
    IID_IShellLink, 
    (LPVOID*)&psl);

正确编译。但我需要将(LPVOID*)&psl替换为*_cast。我必须使用什么演员?

static_cast<LPVOID*>(&psl)生成错误(在MSVC 2013中)。

使用reinterpret_cast<LPVOID*>(&psl)是否正确?

2 个答案:

答案 0 :(得分:1)

是的,reinterpret_cast是正确的选择。通常,从类型*到void *的转换应该是隐式的,而从void *到类型*的转换应该使用static_cast完成。但在你的情况下,你正在从类型**转换为void **,这使你别无选择,只能使用reinterpret_cast。然而,它仍然比c风格的演员更“安全”,因为你无法抛弃常数。

答案 1 :(得分:1)

我认为您可能必须使用reinterpret_cast,因为CoCreateInstance函数的最后一个参数用于输出目的。 请看这个链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686615(v=vs.85).aspx

因此,无论您是进行C样式转换还是使用reinterpret_cast,该函数只是想在堆中创建对象后将指针值放入变量“psl”中。