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;
}
Mi sono preoccupato di come assegnare un oggetto __stdcall function
a std::function
. Ma senza alcuna convenzione di chiamata specifica, sembra funzionare bene. Come può std::function
sapere quale convenzione di chiamata è?Come funziona la funzione std :: function sulla convenzione di chiamata?
Allo stesso modo il compilatore sa come chiamare la funzione senza 'std :: function'. 'std :: function' usa type-erasure per creare una minuscola black-box interna che, quando chiamate la' std :: function', viene chiamata per eseguire la chiamata "reale", che il compilatore ha già capito. – GManNickG