C++ mingw:从lambda到函数指针的转换无效

C++ mingw:从lambda到函数指针的转换无效,c++,c++11,winapi,lambda,mingw,C++,C++11,Winapi,Lambda,Mingw,尝试提供lambda作为指向Win32 API调用的函数指针在使用mingw 5.3.0编译时失败,尽管它在使用MSVC(Visual Studio 2013的)时编译良好 MCVE: #包括 int main(int argc,char*argv[]) { 布尔参数数据; EnumWindows([](HWND windowHandle,LPRAM参数)->BOOL{ 返回1; },重新解释强制转换(¶meterData)); } GCC抛出以下错误消息,我无法理解: error:

尝试提供lambda作为指向Win32 API调用的函数指针在使用mingw 5.3.0编译时失败,尽管它在使用MSVC(Visual Studio 2013的)时编译良好

MCVE:

#包括
int main(int argc,char*argv[])
{
布尔参数数据;
EnumWindows([](HWND windowHandle,LPRAM参数)->BOOL{
返回1;
},重新解释强制转换(¶meterData));
}
GCC抛出以下错误消息,我无法理解:

error: invalid user-defined conversion from 'main(int, char**)::<lambda(HWND, LPARAM)>' to 'WNDENUMPROC {aka int (__attribute__((__stdcall__)) *)(HWND__*, long int)}' [-fpermissive]
  }, reinterpret_cast<LPARAM>(&parameterData));
                                             ^
note: candidate is: main(int, char**)::<lambda(HWND, LPARAM)>::operator BOOL (*)(HWND, LPARAM)() const <near match>
  EnumWindows([](HWND windowHandle, LPARAM parameter) -> BOOL {
                                                         ^
note:   no known conversion from 'BOOL (*)(HWND, LPARAM) {aka int (*)(HWND__*, long int)}' to 'WNDENUMPROC {aka int (__attribute__((__stdcall__)) *)(HWND__*, long int)}'
In file included from C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/Windows.h:72:0,
                 from main.cpp:1:
note:   initializing argument 1 of 'WINBOOL EnumWindows(WNDENUMPROC, LPARAM)'
   WINUSERAPI WINBOOL WINAPI EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);
错误:从“main(int,char**):”到“WNDENUMPROC{aka int(uuu属性_uuu((uu stdcall_uu))*)(HWND_uuu*,long int)}[-fppermissive]的用户定义转换无效
},重新解释强制转换(¶meterData));
^
注:候选者是:main(int,char**)::操作符BOOL(*)(HWND,LPARAM)()const
EnumWindows([](HWND windowHandle,LPRAM参数)->BOOL{
^
注:没有已知的从'BOOL(*)(HWND,LPARAM){aka int(*)(HWND,long int)}'到'WNDENUMPROC{aka int(uu属性_uu)((u stdcall_u))*)(HWND,long int)}的转换
在C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/Windows.h:72:0中包含的文件中,
来自main.cpp:1:
注意:正在初始化“WINBOOL EnumWindows(WNDENUMPROC,LPARAM)”的参数1
WINUSERAPI WINBOOL WINAPI EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM LPARAM);

GCC到底不喜欢什么?为了使用lambda作为
EnumWindows
的第一个参数,需要更改什么?

EnumWindows
需要使用
stdcall
调用约定的回调。GCC不支持将无状态lambda转换为
stdcall
函数指针,并且据我所知,没有办法这样标记lambda。然而,MSVC提供了到具有各种调用约定的函数指针的转换

不幸的是,您将不得不使用单独的函数或使用MSVC:

BOOL CALLBACK callback(HWND windowHandle, LPARAM parameter) { ... }
...
EnumWindows(callback, reinterpret_cast<LPARAM>(&parameterData));
BOOL回调(HWND windowHandle,LPARAM参数){…}
...
枚举窗口(回调、重新解释强制转换(¶meterData));

问题似乎是无状态lambda的转换……编译器支持它吗?
BOOL CALLBACK callback(HWND windowHandle, LPARAM parameter) { ... }
...
EnumWindows(callback, reinterpret_cast<LPARAM>(&parameterData));