Make data_impl constexpr for zero-size strings

This commit is contained in:
Krystian Stasiowski
2019-12-21 19:06:19 -05:00
parent 71c82e4016
commit 60fcd0db87
2 changed files with 16 additions and 12 deletions

View File

@ -119,7 +119,7 @@ public:
#ifdef BOOST_STATIC_STRING_ALLOW_UNINIT_MEM #ifdef BOOST_STATIC_STRING_ALLOW_UNINIT_MEM
CharT data_[N + 1]; CharT data_[N + 1];
#else #else
CharT data_[N + 1]{}; CharT data_[N + 1]{0};
#endif #endif
}; };
@ -129,17 +129,17 @@ class static_string_base_zero<0, CharT, Traits>
{ {
public: public:
BOOST_STATIC_STRING_CPP11_CONSTEXPR BOOST_STATIC_STRING_CPP11_CONSTEXPR
static_string_base_zero() noexcept { } static_string_base_zero() noexcept { }
BOOST_STATIC_STRING_CPP11_CONSTEXPR BOOST_STATIC_STRING_CPP11_CONSTEXPR
static_string_base_zero(std::size_t) noexcept { } static_string_base_zero(std::size_t) noexcept { }
// not possible to constexpr with the static there // Modifying the null terminator is UB
BOOST_STATIC_STRING_CPP11_CONSTEXPR
CharT* CharT*
data_impl() const noexcept data_impl() const noexcept
{ {
static CharT null{}; return const_cast<CharT*>(&null_);
return &null;
} }
BOOST_STATIC_STRING_CPP11_CONSTEXPR BOOST_STATIC_STRING_CPP11_CONSTEXPR
@ -158,12 +158,15 @@ public:
BOOST_STATIC_STRING_CPP14_CONSTEXPR BOOST_STATIC_STRING_CPP14_CONSTEXPR
void void
term_impl() noexcept term_impl() noexcept { }
{
} private:
static constexpr CharT null_{0};
}; };
template<typename CharT, typename Traits>
constexpr CharT static_string_base_zero<0, CharT, Traits>::null_;
// Optimization for storing the size in the last element // Optimization for storing the size in the last element
template<std::size_t N, typename CharT, typename Traits> template<std::size_t N, typename CharT, typename Traits>
class static_string_base_null class static_string_base_null
@ -213,7 +216,7 @@ public:
#ifdef BOOST_STATIC_STRING_ALLOW_UNINIT_MEM #ifdef BOOST_STATIC_STRING_ALLOW_UNINIT_MEM
CharT data_[N + 1]; CharT data_[N + 1];
#else #else
CharT data_[N + 1]{}; CharT data_[N + 1]{0};
#endif #endif
}; };

View File

@ -6971,6 +6971,10 @@ constexpr bool testConstexpr()
constexpr auto h = s2.back(); constexpr auto h = s2.back();
} }
static_string<0> a;
constexpr auto b = a.data();
//constexpr auto g = s1.assign(1, '1'); //constexpr auto g = s1.assign(1, '1');
//constexpr auto h = s1.assign({'1'}); //constexpr auto h = s1.assign({'1'});
//constexpr auto i = s1.assign("", 1); //constexpr auto i = s1.assign("", 1);
@ -7021,9 +7025,6 @@ runTests()
testHash(); testHash();
static_string<1>() + static_string<3>();
static_string<3>() + "ggggg";
return report_errors(); return report_errors();
} }