int __cdecl ccall(int i)
{
wprintf(L"ccall(%d)", i);
return 0;
}
int __stdcall stdcall(int i)
{
wprintf(L"stdcall(%d)", i);
return 0;
}
int __cdecl wmain(int argc, wchar_t **argv)
{
std::function<int(int)> fnc = ccall;
std::function<int(int)> fnstd = stdcall;
fnc(10); // printed well
fnstd(100); // printed well
return 0;
}
我担心如何将__stdcall function
分配给std::function
对象。
但是没有任何指定调用约定,它看起来好像工作。 std::function
如何知道调用约定是什么?
答案 0 :(得分:6)
std::function
能够存储使用任何调用约定的函数指针。
§20.8.11.2:
函数类模板提供了多态包装器,它概括了函数指针的概念。给定调用签名(20.8.1),Wrappers可以存储,复制和调用任意可调用对象(20.8.1),允许函数成为第一类对象。
作为John Calsbeek added:关于调用约定的标准中没有特别的内容,但编译器正在完成它们的工作,函数指针包含有关约定的信息。
使用函数指针,您需要指定异常调用约定:
typedef int(* c_ptr_t)(int);
typedef int(__stdcall * std_ptr_t)(int);
c_ptr_t c_ptr = ccall;
std_ptr_t std_ptr = stdcall;
// But std::function doesn't mind:
std::function<int(int)> fnc = c_ptr;
std::function<int(int)> fnstd = std_ptr;