Они эквивалентны, потому что спецификация C ++ говорит, что они оба соответствуют требованиям двоичного предиката. Следующие выдержки кажутся актуальными.
[function.objects]
20.14.1 Тип объекта функции - это тип объекта, который может быть типом выражения postfix в вызове функции ([expr.call], [over.match.call]). 224 Объект функции является объект типа объекта функции. В тех местах, где можно ожидать передачи указателя на функцию в алгоритмический шаблон, интерфейс указывается для приема объекта функции. Это не только заставляет алгоритмические шаблоны работать с указателями на функции, но и позволяет им работать с произвольными объектами функций.
[alg.sorting]
25.7.2 Сравнить - это тип функционального объекта ([function.objects]), который отвечает требованиям для параметра шаблона с именем BinaryPredicate ([gorithms.requirements]) . Возвращаемое значение операции вызова функции, примененной к объекту типа Compare, когда контекстно преобразуется в bool ([conv]), возвращает true, если первый аргумент вызова меньше второго, и false в противном случае. Сравнение comp используется повсеместно для алгоритмов, предполагающих отношение порядка.
[algorithms.requirements]
25.2.8 Если нет других ограничений, параметр BinaryPredicate используется всякий раз, когда алгоритм ожидает функциональный объект, который при применении к результату разыменования двух соответствующих итераторов или разыменования итератора и типа T, когда T является частью сигнатуры, возвращает значение, проверяемое как истинное. Другими словами, если алгоритм принимает BinaryPredicate binary_pred в качестве своего аргумента и first1 и first2 в качестве аргументов итератора с соответствующими типами значений T1 и T2, он должен работать правильно в конструкции binary_pred (* first1, * first2), контекстно преобразованной в bool ([ ко]). Если не указано иное, BinaryPredicate всегда принимает значение первого_тератора value_type в качестве первого аргумента, то есть в тех случаях, когда значение T является частью сигнатуры, оно должно работать правильно в конструкции binary_pred (* first1, value), контекстно преобразованной в bool ( [ко]). binary_pred не должен применять какую-либо непостоянную функцию через разыменованные итераторы. Учитывая glvalue u типа (возможно, const) T1, который обозначает тот же объект, что и * first1, и glvalue v типа (возможно, const) T2, который обозначает тот же объект, что и * first2, binary_pred (u, * first2) , binary_pred (* first1, v) и binary_pred (u, v) должны быть допустимым выражением, равным binary_pred (* first1, * first2) , а binary_pred (u, value) должно быть допустимым выражением это равно binary_pred (* first1, значение).
Что касается вопроса, который предпочтительнее, я бы сказал, что он основан на мнении, если только в вашем конкретном случае профилирование не покажет, что оно лучше.