
Consider the output of the following program: #include <iostream> #include <algorithm> #include <boost/range.hpp> #include <boost/range/as_array.hpp> #include <boost/range/as_literal.hpp> void print_char(char ch) { std::cout << ch << '\t' << (int)ch << '\n'; } template<typename Range> void print_range(Range const &rng) { std::for_each(boost::begin(rng), boost::end(rng), print_char); } int main() { print_range(boost::as_literal("hello")); std::cout << '\n'; print_range(boost::as_array("hello")); std::cout << '\n'; return 0; } It prints the following: h 104 e 101 l 108 l 108 o 111 h 104 e 101 l 108 l 108 o 111 There is no difference between treating a string literal as an array or as a null-terminated string. There should be. When treated as an array, the null-terminator should be treated as any other element in the array. The problem comes from range/detail/implementation_help.hpp: template< class T, std::size_t sz > inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag ) { return boost_range_array + sz - 1; } It seems Boost.Range is still treating arrays of char and wchar_t specially. IIRC, we decided long ago that it shouldn't. This is on HEAD, BTW. -- Eric Niebler Boost Consulting www.boost-consulting.com