Требования к реализации двоичного предиката 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. Другими словами, если алгоритм принимаетBinaryPredicatebinary_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.