How to use a lambda expression as a template parameter?
The 2nd template parameter of std::set expects a type, not an expression, so it is just you are using it wrongly. You could create the set like this: auto comp = [](const A& lhs, const A& rhs) -> bool { return lhs.x < rhs.x; }; auto SetOfA = std::set <A, decltype(comp)> (comp);