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
знать, что такое конвенция?Как известно std :: function о вызове?
Таким же образом компилятор знает, как вызвать функцию без 'станд :: function'. 'std :: function' использует стирание типа для создания крошечного внутреннего черного ящика, когда при вызове' std :: function' предлагается выполнить «реальный» вызов, который уже выяснил компилятор. – GManNickG