From fec5fb97c8b172853178c4593b84ed1f62cce57e Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 11 May 2021 02:15:27 +0300 Subject: [PATCH] Enable move-only deleters in the nullptr_t constructors --- include/boost/smart_ptr/shared_ptr.hpp | 20 ++++++++++++++++++++ test/sp_move_only_deleter.cpp | 22 ++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/include/boost/smart_ptr/shared_ptr.hpp b/include/boost/smart_ptr/shared_ptr.hpp index e3f3142..386ac09 100644 --- a/include/boost/smart_ptr/shared_ptr.hpp +++ b/include/boost/smart_ptr/shared_ptr.hpp @@ -397,10 +397,20 @@ public: #if !defined( BOOST_NO_CXX11_NULLPTR ) +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + + template shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), pn( p, static_cast< D&& >( d ) ) + { + } + +#else + template shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), pn( p, d ) { } +#endif + #endif // As above, but with allocator. A's copy constructor shall not throw. @@ -423,12 +433,22 @@ public: #if !defined( BOOST_NO_CXX11_NULLPTR ) +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + + template shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), pn( p, static_cast< D&& >( d ), a ) + { + } + +#else + template shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), pn( p, d, a ) { } #endif +#endif + // generated copy constructor, destructor are fine... #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) diff --git a/test/sp_move_only_deleter.cpp b/test/sp_move_only_deleter.cpp index 08cd576..8154ec5 100644 --- a/test/sp_move_only_deleter.cpp +++ b/test/sp_move_only_deleter.cpp @@ -125,6 +125,28 @@ int main() BOOST_TEST( Y::instances == 0 ); } +#if !defined( BOOST_NO_CXX11_NULLPTR ) + + { + boost::shared_ptr p( nullptr, YD() ); + + YD del; + p = boost::shared_ptr( nullptr, std::move( del ) ); + + BOOST_TEST( del.moved_ ); + } + + { + boost::shared_ptr p( nullptr, YD(), std::allocator() ); + + YD del; + p = boost::shared_ptr( nullptr, std::move( del ), std::allocator() ); + + BOOST_TEST( del.moved_ ); + } + +#endif + return boost::report_errors(); }