|
Boost : |
From: Joe Gottman (jgottman_at_[hidden])
Date: 2005-12-31 08:11:12
"Eric Niebler" <eric_at_[hidden]> wrote in message
news:43B6220B.4050408_at_boost-consulting.com...
> There is a bug in Boost.Range that is causing boost::end() to execute a
> slower code path when called with a string literal. The type of "hello"
> is char const [6], and end() should be O(1). Indeed, Boost.Range has
> code to handle just this case, but it never gets called. The problem is
> the way overload resolution happens between these two functions
>
> template< typename T, std::size_t sz >
> const T* boost_range_end( const T (&array)[sz] )
>
> const char* boost_range_end( const char* s )
>
> The first is O(1) and the second is O(N) becuase it calls strlen. But
> the second will always be chosen because non-templates are preferred
> over templates.
>
These two functions are not equivalent, since strlen("hello") equals 5
and not 6. Depending on what you are using the range for, you might or
might not want the '\0' at the end of the string to be part of the range.
Joe Gottman
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk