std::function
является гибким и использует type erasure
снизу, поэтому, если у вас есть std::function
объект с подписью std::function<R(Args...)>
, он примет любой Callable
, который может быть вызван с типом Args...
, и вернет тип R
,
Так что в вашем случае для std::function<int(int)>
, функция типа int g(double);
может быть вызвана с типом int
аргумент, компилятор просто переведет int
в double
,
Если вы запустите этот код
#include <iostream>
#include <functional>
int f(int x) { std::cout << x << " " << "//f:int->int\n"; return x; }
int g(double x) { std::cout << x << " " << "//g:double->int\n"; return 1; }
int main()
{
std::function<int(int)> fct;
fct = f; fct(1);
fct = g; fct(2.5);
}
Вы увидите, что fct
примет только int
, а затем компилятор увеличит его до double
, поэтому при выводе fct(2.5);
он напечатает 2 //g:double->int
а не 2.5 //g:double->int