Следующий код был скомпилирован с VС++ 2012:
void f1(void (__stdcall *)())
{}
void f2(void (__cdecl *)())
{}
void __cdecl h1()
{}
void __stdcall h2()
{}
int main()
{
f1(h1); // error C2664
f2(h2); // error C2664
f1([](){}); // OK
f2([](){}); // OK
auto fn = [](){};
f1(fn); // OK
f2(fn); // OK
}
Я думаю, что ошибки нормальны, но ОК являются ненормальными.
Итак, мои вопросы:
-
Что такое вызывающее соглашение для лямбда-функции С++?
-
Как указать соглашение о вызове функции лямбда С++?
-
Если соглашение о вызове не определено, как правильно переубрать пространство стека после вызова лямбда-функции?
-
Является ли компилятор автоматически генерировать несколько версий лямбда-функции? то есть в виде следующего псевдокода:
[] __stdcall() {};
[] __cdecl() {}; и др.