On Nov 2, 2013, at 10:49 PM, Antony Polukhin
2013/11/3 Michael Marcin
On 11/2/2013 9:43 AM, Marshall Clow wrote:
On Nov 1, 2013, at 4:42 PM, Michael Marcin
wrote: I noticed string_ref doesn't have a constructor for a string literal.
Wouldn't this save a call to strlen for a common case?
Ex.
template< std::size_t N > basic_string_ref( const charT( &str )[N] ) : basic_string_ref( str, N-1 ) { static_assert(N >= 1, "not a string literal"); }
string_ref test( "test" );
So, what should string_ref ( "test\0test" ) do?
{ ptr, 4 } --> current behavior { ptr, 9 } --> your suggested behavior
So, what should
const char s[] = {'0', '1', '2'}; string_ref test{s};
do?
Neither seems to be very important and can be handled by requiring sane preconditions.
Marshall, how about adding the following constructor:
template< std::size_t N > basic_string_ref( const charT( &str )[N] ) : basic_string_ref( str, std::min(N, strlen(str)) ) /* pseudo code, we'll need something like strlen_s */ {}
Such constructor won't change the current behavior
string_ref ( "test\0test" ) // { ptr, 4 }
but will also work for non-zero terminated fixed length arrays:
const char s[] = {'0', '1', '2'}; string_ref test(s); // {ptr, 3}
No, actually, it won't, because the strlen will read past the end of the array, looking for the terminating NULL. (and that's undefined behavior) Personally, I'm content with the current situation where * If you have a NULL terminated string (by far the most common case), the { pointer } constructor works fine. * If you have something else, you have to use the { pointer, size } constructor. -- Marshall Marshall Clow Idio Software mailto:mclow.lists@gmail.com A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait). -- Yu Suzuki