¿Se puede expresar el 'tipo' de una expresión lambda?

Pensando en las expresiones lambda como 'azúcar sintáctico' para objetos invocables, ¿se puede expresar el tipo subyacente sin nombre?

Un ejemplo:

struct gt {
    bool operator() (int l, int r) {
        return l > r;
    }
} ;

Ahora,[](int l, int r) { return l > r; } es un reemplazo elegante para el código anterior (más la creación necesaria de objetos invocables de gt), pero ¿hay alguna manera de expresar gt (el tipo) en sí?

Un uso simple:

std::set<int, gt> s1;  // A reversed-order std::set
// Is there a way to do the same using a lambda?
std::set<int, some-magic-here-maybe([](int l, int r) { return l > r; }) > s2;

Respuestas a la pregunta(4)

Su respuesta a la pregunta