Требования к реализации двоичного предиката C++ для std:: search
на сайт в нем говорится, что одно из ограничений для двоичного предиката передано в std::search
Это:
типы Type1 и Type2 должны быть такими, чтобы объекты типов ForwardIt1 и ForwardIt2 можно было разыменовать, а затем неявно преобразовать в Type1 и Type2.
однако в документации по международному стандарту C++ я не вижу ссылки на такое ограничение. Мне интересно, является ли это ограничение явным указано в документации международного стандарта C++, раздел которой он находится под. Кроме того, если это не так, то почему это ограничение, возложенное на std::search
функция как невозможно иметь два разных типа, которые, хотя и неявно конвертируемые, имеют перегрузку оператора равенства?
3 ответов
это ошибка на сайте.
описание этого параметра заполняется из этот шаблон. Он не различает двоичные предикаты, которые называются только pred(*first1, *first2)
из тех, что называют как pred(*first1, *first2)
и pred(*first2, *first1)
дальше копать:
Оказывается, что редактировать добавлен именованный параметр в Родительский шаблон использование cast req2
, который контролирует, говорит ли он "оба" или "соответственно." The eq
variant не имеет passthrough этого нового параметра. У меня нет права редактирования, чтобы добавить его в шаблон и запись std::search
требование BinaryPredicate
указано в [алгоритмы.требования]/7:
на
BinaryPredicate
параметр используется всякий раз, когда алгоритм ожидает объект функции, который при применении к результату разыменования двух соответствующих итераторов или разыменования итератора и типаT
, когдаT
является частью подписи возвращает значение, проверяемое какtrue
. Другими словами, если алгоритм принимаетBinaryPredicate
binary_pred
в качестве аргумента иfirst1
иfirst2
в качестве аргументов итератора он должен работать правильно в конструкцииbinary_pred(*first1, *first2)
контекстно преобразовано вbool
([conv]).BinaryPredicate
всегда принимает первый итераторvalue_type
в качестве первого аргумента, то есть в тех случаях, когдаT value
является частью подписи, она должна работать правильно в конструкцииbinary_pred(*first1, value)
контекстно преобразовано вbool
([conv]).binary_pred
не применит никакую непостоянную функцию через разыменованное итераторы.
нет необходимости в построении Type1
от разыменования ForwardIt2
. Слово"и' в цитате OP из cppreference неточно.
Ок, я, наконец, вижу твое замешательство. Это вызвано тем, как было использовано слово "оба".
значение должно заключаться в том, что оба из следующих условий должны быть истинными:
тип
Type1
должен быть таким, чтобы объекты типаForwardIt1
может быть разыменовано, а затем неявно преобразовано вType1
тип
Type2
должен быть таким, чтобы объекты типаForwardIt2
может быть разыменован, а затем неявно преобразован кType2
вы найдете требования в 25.2.13 Search [alg.поиск]:
§25.2.13 Поиск [alg.поиск]
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
- Returns: первый итератор
i
в ассортименте[first1,last1 - (last2-first2))
такие, что для каждого неотрицательного целого числаn
меньшеlast2 - first2
следующие соответствующие условия:*(i + n) == *(first2 + n)
,pred(*(i + n), *(first2 + n)) != false
. Возвращаетfirst1
если[first2, last2)
пусто, в противном случае возвращаетlast1
если нет такие итератор найден.
соответствующее условие:
pred(*(i + n), *(first2 + n)) != false
это означает, что pred(*(i + n), *(first2 + n))
действителен. Это значит, что *(i + n)
и *(first2 + n)
можно передать в качестве аргументов pred. Это означает, что первый парам pred
должен быть сконструирован из разыменования ForwardIterator1
и 2-й параметр pred
должен быть сконструирован из разыменования ForwardIterator2
.