Boost.Range Portability

# Boost.Range

## Portability

A huge effort has been made to port the library to as many compilers as possible.

Full support for built-in arrays require that the compiler supports class template partial specialization. For non-conforming compilers there might be a chance that it works anyway thanks to workarounds in the type traits library.

Notice also that some compilers cannot do function template ordering properly. In that case one must rely of `range_result_iterator` and a single function definition instead of overloaded versions for const and non-const arguments. So if one cares about old compilers, one should not pass rvalues to the functions.

For maximum portability you should follow these guidelines:

1. do not use built-in arrays,
2. do not pass rvalues to `begin()`, `end()` and `iterator_range` Range constructors and assignment operators,
3. use `const_begin()` and `const_end()` whenever your code by intention is read-only; this will also solve most rvalue problems,
4. do not rely on ADL:
   - if you overload functions, include that header before the headers in this library,
   - put all overloads in namespace `boost`.

(C) Copyright Thorsten Ottosen 2003-2004