为什么这个 pointer_cast 失败了?

Why does this pointer_cast fail?

这个 if 测试工作正常(已经做了很多年):

if (m_pMapSPtrEvents->Lookup(strKey, (void*&)psEvent))
{
    if (psEvent != nullptr)
    {
        bActivate = TRUE;
        strTipText = psEvent->strEvent;
    }
}

但是如果我把它改成:

if (m_pMapSPtrEvents->Lookup(strKey, pointer_cast<void*&>(psEvent)))
{
    if (psEvent != nullptr)
    {
        bActivate = TRUE;
        strTipText = psEvent->strEvent;
    }
}

其中`pointer_cast是:

template<typename T, typename U> static T inline pointer_cast(U src) noexcept
{
    static_assert(sizeof(T) >= sizeof(U), "Invalid pointer cast"); // Check sizes!
    __pragma(warning(suppress:26490)) // Note: no semicolon after this expression!
        return reinterpret_cast<T>(src);
}

失败了。铸造我的结构指针 (SPECIAL_EVENT_S *psEvent) 的现代方法是什么?

m_pMapSPtrEvents 属于 CMapStringToPtr.

类型

我要指出:

...除非我恢复到 c 风格转换。


更新

如果我按照建议删除 &,我会收到构建错误:

4>MyMonthCalCtrl.cpp
4>D:\My Programs22\MeetSchedAssist\Meeting Schedule Assistant\MyMonthCalCtrl.cpp(72,8): error C2664: 'BOOL CMapStringToPtr::Lookup(LPCTSTR,void *&) const': cannot convert argument 2 from 'T' to 'void *&'
4>        with
4>        [
4>            T=void *
4>        ]
4>C:\Program Files\Microsoft Visual Studio22\Preview\VC\Tools\MSVC.30.30704\atlmfc\include\afxcoll.h(1264,7): message : see declaration of 'CMapStringToPtr::Lookup'
4>Done building project "Meeting Schedule Assistant.vcxproj" -- FAILED.

我相信有人会整理一个描述为什么 pointer_cast 失败的答案——他们比我更能解释。


解决方法

我的回答提供了解决方法。考虑到这些警告的上下文(MFC 应用程序)并考虑到存在必须使用 reinterpret_cast 的有效实例,我已将以下行添加到我的 stdafx.h 文件中:

#pragma warning( disable : 26490)

并使用查找/替换将所有 pointer_cast 还原为 reinterpret_cast。该应用程序现在运行正常。