Because there is no reason not to allow it. When f_source's operator() receives an int, by value, there is nothing preventing it from passing that int as argument to a function with a const int& parameter. The return and parameter types doesn't have to match exactly as long as they are compatible.