std::函数如何知道调用约定

How does std::function know about calling convention?

本文关键字:调用 约定 何知道 函数 std      更新时间:2023-10-16
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能够存储使用任何调用约定的函数指针。

§ 20.8.11.2:

函数

类模板提供通用函数指针概念的多态包装器。包装器可以存储、复制和调用任意可调用对象 (20.8.1),给定调用签名 (20.8.1),允许函数成为一等对象。

正如 John Calsbeek 所补充的那样:标准中没有关于调用约定的特别内容,但编译器正在做他们的工作,函数指针包含有关约定的信息。

使用函数指针时,您需要指定不寻常的调用约定:

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;