Ответ 1
Вам нужно передать тип лямбды в качестве аргумента шаблона, а не самой лямбда. Что вы хотите, так это:
auto mycomp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(mycomp)> test(mycomp);
Хотя на самом деле, поскольку ваш лямбда не имеет захватов, он может быть фактически сохранен в указателе функции, так что в качестве альтернативы вы можете сделать это:
std::map<int, int, bool(*)(const int&,const int&)>
test([](const int&a, const int& b) { return a < b; });
Хотя я считаю, что первое гораздо более читаемое. Хотя использование типа указателя функции является более универсальным. т.е. он может принимать любой указатель функции или не захватывающий лямбда, который соответствует этой сигнатуре. Но если вы измените свою лямбду для захвата, это не сработает. Для более универсальной версии вы можете использовать std::function
, i.e:
std::map<int, int, std::function<bool(const int&, const int&)>>
Это будет работать с любой функцией, лямбдой (захватом или нет) или функциональным объектом, если подпись соответствует.