Как инициализировать вызываемый объект?

#c #c 11 #templates #callable-object

#c #c 11 #шаблоны #вызываемый объект

Вопрос:

Сегодня я изучаю аргумент шаблона по умолчанию, и сначала все в порядке, но теперь я сталкиваюсь с некоторыми проблемами.

 template <typename T, typename F = std::less<T>>
int compare(const T amp;v1, const T amp;v2, F f = F()) {
    if (f(v1, v2)) return -1;
    if (f(v2, v1)) return 1;
    return 0;
}
  

Я знаю, что F это тип вызываемого объекта и f является вызываемым объектом, но что F() это значит? Тип и operator()?
И что меня еще больше смущает, так это то, что F() ничего не принимает, тогда как f(v1, v2) принимает 2 объекта. Инициализация меня сильно смутила.
Если кто-нибудь может помочь мне разобраться в этих кодах, я был бы очень благодарен.Спасибо.

Комментарии:

1. F() является временным типом F , созданным с помощью конструктора по умолчанию. f(v1, v2) вызывает F::operator() (который предположительно принимает два аргумента) объект типа F .

2. Вы даже можете объединить их и написать F()(v1, v2) — это создает временный объект, а затем немедленно вызывает operator() его. Примерно эквивалентно F temp; temp.operator()(v1, v2);

3. @IgorTandetnik Теперь я это полностью понимаю, спасибо!