First of all, I understand that this is a requirement imposed by the Standard. 
However, the requirement, in general, is valid only for iterators that do not
refer to any container.  This is not the case with iterators useful in
algorithms; the default value of such an iterator has no meaning.
Moreover, the implementation of the library has no obligation to check this
trait for every algorithm, and I suggest that this check should be removed. 
The code for std::lower_bound does not use this feature in a meaningful way,
and it is straightforward to fix.
The patch below, apart from fixing the problem, also replaces iterator with
std::iterator.

  template<typename _ForwardIterator, typename _Tp>
    _ForwardIterator
    lower_bound(_ForwardIterator __first, _ForwardIterator __last,
                const _Tp& __val)
    {
      typedef typename std:: iterator_traits<_ForwardIterator>::value_type
        _ValueType;
      typedef typename std:: iterator_traits<_ForwardIterator>::difference_type
        _DistanceType;

      // concept requirements
      __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
      __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
      __glibcxx_requires_partitioned_lower(__first, __last, __val);

      _DistanceType __len = std:: distance(__first, __last);
      _DistanceType __half;

      while (__len > 0)
        {
        _ForwardIterator __middle ((__first));
          __half = __len >> 1;
          std::advance(__middle, __half);
          if (*__middle < __val)
            {
              __first = __middle;
              ++__first;
              __len = __len - __half - 1;
            }
          else
            __len = __half;
        }
      return __first;
    }


-- 
           Summary: lower_bound iterator must be default constructible
           Product: gcc
           Version: 4.4.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: giecrilj at stegny dot 2a dot pl
 GCC build triplet: x86_64-suse-linux
  GCC host triplet: x86_64-suse-linux
GCC target triplet: x86_64-suse-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45488

Reply via email to