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;
}
Ich war besorgt, wie ich eine __stdcall function
zu std::function
Objekt zuweisen. Aber ohne irgendwelche Aufruf Konvention, es sieht aus wie gut funktioniert. Wie kann std::function
wissen, welche Aufrufkonvention ist?Wie kennt die std :: function die Aufrufkonvention?
In gleicher Weise wird der Compiler weiß, wie die Funktion aufrufen, ohne 'std :: function'. 'std :: function' verwendet type-errasure, um eine kleine interne Black-Box zu erzeugen, die, wenn Sie die' std :: function aufrufen, aufgefordert wird, den "echten" Aufruf auszuführen, den der Compiler bereits herausgefunden hat. – GManNickG