Implement Fibonacci range
Overall, I think the code looks good.  Here are a few sugestions that may help you improve your code.

Check for overflow

As you know, terms of the Fibonacci sequence get very big very quickly.  For this reason, it's easy to overflow the numerical range.  I'd suggest addressing this by throwing an exception in iterator&amp; operator++():

if (b_ &lt; a_) {
  throw std::overflow_error("Exceeded range of underlying type");
}


Use an unsigned type

None of the terms of the Fibonacci sequence are negative, so I'd suggest that perhaps unsigned or even unsigned long might be more appropriate base types.  

Use a template

It may make sense to turn this into a templated function to allow different types to be used as the base type.  This would be one way to extend the range, such as with the GNU Multiple Precision Arithmetic Library.

Consider a different operator++ implementation

The current implementation of the operator++ is this:

iterator&amp; operator++() {
  ++i_;
  b_ = b_ + a_;
  a_ = b_ - a_;
  return *this;
}


I would suggest, especially if you decide to implement templates, that this might be more efficient:

iterator&amp; operator++() {
  ++i_;
  std::swap(a_, b_);
  b_ += a_;
  if (b_ &lt; a_) {
      throw std::overflow_error("Exceeded range of underlying type");
  }
  return *this;
}