Ответ 1
boost:: bind перегружает оператора! и реляционные и логические операторы ==,! =, <, < =, > , > =, & &, ||, поэтому именно поэтому вы видите "булево" выражение, но вы действительно получаете назад предикат функции.
Оттуда вы можете видеть, что вы привязываете второй член пары для 1-го и 2-го аргументов перегруженного меньше функции.
Что касается вашего второго вопроса: Boost bind распознает, когда вы передали указатель на член и рассматриваете его так, как если бы вы вызывали
bind<R>(mem_fun(&std::pair<int,int>::second), args);
Вот как описано в документации:
Использование bind с указателями на элементы
Указатели на функции-члены и указатели на данные не являются функциональных объектов, поскольку они не support operator(). Для удобства, bind принимает указатели элементов как свои первый аргумент, а поведение - как если boost:: mem_fn используется для преобразовать указатель элемента в функциональный объект. Другими словами, Выражение
bind (& X:: f, args)
эквивалентно
bind (mem_fn (& X:: f), args)
где R - возвращаемый тип X:: f (для функций-членов) или типа член (для членов данных.)
Вы можете найти эту и более информацию здесь.