Требования к реализации двоичного предиката 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);
  1. 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.