Skip to content

Commit 87e0f84

Browse files
committed
Make constructor taking C-string constexpr for C++11/14 (#22, thanks to @xirius)
1 parent 6a90837 commit 87e0f84

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

include/nonstd/string_view.hpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,22 @@ nssv_DISABLE_MSVC_WARNINGS( 4455 26481 26472 )
404404

405405
namespace nonstd { namespace sv_lite {
406406

407+
#if nssv_CPP11_OR_GREATER
408+
409+
namespace detail {
410+
411+
// Expect tail call optimization to make length() non-recursive:
412+
413+
template< typename CharT >
414+
inline constexpr std::size_t length( CharT * s, std::size_t result = 0 )
415+
{
416+
return *s == '\0' ? result : length( s + 1, result + 1 );
417+
}
418+
419+
} // namespace detail
420+
421+
#endif // nssv_CPP11_OR_GREATER
422+
407423
template
408424
<
409425
class CharT,
@@ -464,7 +480,13 @@ class basic_string_view
464480

465481
nssv_constexpr basic_string_view( CharT const * s) nssv_noexcept // non-standard noexcept
466482
: data_( s )
483+
#if nssv_CPP17_OR_GREATER
467484
, size_( Traits::length(s) )
485+
#elif nssv_CPP11_OR_GREATER
486+
, size_( detail::length(s) )
487+
#else
488+
, size_( Traits::length(s) )
489+
#endif
468490
{}
469491

470492
// Assignment:

0 commit comments

Comments
 (0)