diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index a3e5354848a..610083167d8 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -141,7 +141,7 @@ namespace ranges struct __box<_Tp> { private: - [[no_unique_address]] _Tp _M_value; + [[no_unique_address]] _Tp _M_value = _Tp(); public: __box() = default; @@ -160,7 +160,7 @@ namespace ranges template requires constructible_from<_Tp, _Args...> - constexpr + constexpr explicit __box(in_place_t, _Args&&... __args) noexcept(is_nothrow_constructible_v<_Tp, _Args...>) : _M_value{std::forward<_Args>(__args)...} diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/detail/semiregular_box.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/detail/semiregular_box.cc index 392acff3eb6..748137f7e33 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/detail/semiregular_box.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/detail/semiregular_box.cc @@ -71,3 +71,13 @@ static_assert(requires (__box a) { a.operator->(); a.has_value(); }); + +constexpr bool +test01() +{ + // Verify the default constructor value-initializes the underlying object. + __box x; + __glibcxx_assert(*x == 0); + return true; +} +static_assert(test01());