Оба типа кажутся эквивалентными.Чем они отличаются?
Ну ... нет: они разных типов.
Если вы посмотрите на страницу std::function
в cppreference.com , вы можете видеть, что std::function
- это класс с частичной специализацией (определена только специализация), объявленный следующим образом
template <class>
class function; // undefined
template <class R, class... Args>
class function<R(Args...)>;
Таким образом, ваш BynaryOperator<int>
не эквивалентен std::function<int(const int&, const int&)>
, ноэквивалентно аргументу шаблона.
Вы можете видеть, что это true
std::is_same<std::function<int(const int&, const int&)>,
std::function<BinaryOperator<int>>
>::value // ^^^^^^^^^^^^^^...................^