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} -- Best regards, Antony Polukhin