Ваш код недопустим, потому что:
[](int *a, int *b){return *a<*b;}
... это не тип, это объект (определенного типа реализации), поэтому вы не можете использовать его в качестве параметра шаблона.
Вы можете сначала создать объект, а затем найти его тип, используя decltype
:
auto comp = [](int *a, int *b){ return *a<*b; };
std::set<int*, decltype(comp)> S{comp};
Или в C ++ 20 вы можете напрямую применить decltype
:
std::set<int*, decltype([](int *a, int *b){return *a<*b;})> S;
Поскольку ваша лямбда-код не требует захвата, другой способ - использовать тип указателя функции для типа компаратора и позволить компилятору преобразовать лямбда-указатель без захвата в указатель на функцию:
std::set<int*, bool (*)(int*, int*)> S([](int *a, int *b){ return *a<*b; });