Этот вопрос проистекает из неправильного представления. Чтобы очистить, что до:
функторы являются объектами не функции
Попытка присвоить указатель на функцию или лямбда на объект не имеет никакого смысла. Так что это не может быть сделано:
map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });
Пути к определить map
, которая принимает указатель на функцию или лямбда использовать аргументы шаблона от вопроса: map<int, string, function<bool(const int&, const int&)>>
На полпути между двумя непродуманными вариантами в вопросе является еще заблуждение:
map<int, string, [](const int& lhs, const int& rhs){ return lhs > rhs; }>
не работает, так как шаблон компаратора аргумент является типа члена map
, не значение intialization. Так map
используя указатель на функцию или лямбда-компаратор должен всегда иметь это значение, передаваемое в map
конструктор: map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; })
В противном случае function<bool(const int&, const int&)>()
будет использоваться для сравнения в map
.
Это, вероятно, уже ясно, но поскольку функторы являются объектами, которые нельзя передать несвязанным объектом, это значение конструкции совершенно другого типа объекта. Вызов
map<int, string> foo(greater<int>())
это как позвонить
less<int> foo = greater<int>
. Единственный допустимый аргумент конструктора-компилятора для map
, аргумент шаблона-компаратора которого является функтором, является тем, что может быть преобразовано в объект типа функтора в аргументе шаблона: map<int, string, greater<int>> foo(greater<int>{})
Это, очевидно, не нужно, поскольку если аргументы не были предоставлены, а greater<int>
был построен по умолчанию, будет получена такая же инициализация члена map
, поэтому map<int, string, greater<int>>
является достаточным.
Потому что это будет связано с некоторыми типами стирания, что не является оптимальным? –
Возможный дубликат: [Почему бы не вывести шаблонный параметр из конструктора?] (Http://stackoverflow.com/questions/984394/why-not-infer-template-parameter-from-constructor) – NathanOliver
@PiotrSkotnicki Вы говорите, что для версия-функтор? Но не «сопоставляет» конструктор сравнения? http://www.cplusplus.com/reference/map/map/map/ Разве это не так? –