Ticket #12351: 0001-boost-make_shared-use-Constructor-Forwarding-on-C-03.patch

File 0001-boost-make_shared-use-Constructor-Forwarding-on-C-03.patch, 35.2 KB (added by me@…, 6 years ago)

patch boostorg/smart_ptr#24 adding (partial) constructor forwarding on C++03

  • include/boost/smart_ptr/make_shared_object.hpp

    From de38a735ea7793f9c7e747e49e3ce3900b92ab46 Mon Sep 17 00:00:00 2001
    From: Giel van Schijndel <me@mortis.eu>
    Date: Sun, 24 Jul 2016 14:38:21 +0200
    Subject: [PATCH] boost::make_shared: use Constructor Forwarding on C++03
    
    Use Boost.Move's move emulation and documented Constructor Forwarding
    technique to provide (partial) constructor forwarding on compilers that
    don't support r-value references.
    
    This allows constructing types taking movable-but-not-copyable types as
    constructor arguments. Additionally it's generally more efficient for
    movable-and-copyable types, but that's just a nice-to-have.
    ---
     include/boost/smart_ptr/make_shared_object.hpp | 570 ++++++-------------------
     1 file changed, 120 insertions(+), 450 deletions(-)
    
    diff --git a/include/boost/smart_ptr/make_shared_object.hpp b/include/boost/smart_ptr/make_shared_object.hpp
    index 62372fa..3bc78ee 100644
    a b  
    1313//  for documentation.
    1414
    1515#include <boost/config.hpp>
     16#include <boost/move/core.hpp>
     17#include <boost/move/utility_core.hpp>
    1618#include <boost/smart_ptr/shared_ptr.hpp>
    1719#include <boost/smart_ptr/detail/sp_forward.hpp>
    1820#include <boost/type_traits/type_with_alignment.hpp>
    template< class T, class A > typename boost::detail::sp_if_not_array< T >::type  
    338340    return boost::shared_ptr< T >( pt, pt2 );
    339341}
    340342
    341 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
    342 
    343 // For example MSVC 10.0
     343// C++03 version
    344344
    345345template< class T, class A1 >
    346 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 )
     346typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1 )
    347347{
    348348    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    349349
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 )  
    352352    void * pv = pd->address();
    353353
    354354    ::new( pv ) T(
    355         boost::detail::sp_forward<A1>( a1 )
     355        boost::forward<A1>( a1 )
    356356        );
    357357
    358358    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 )  
    364364}
    365365
    366366template< class T, class A, class A1 >
    367 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1 )
     367typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1 )
    368368{
    369369    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    370370
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    372372
    373373    void * pv = pd->address();
    374374
    375     ::new( pv ) T( 
    376         boost::detail::sp_forward<A1>( a1 )
     375    ::new( pv ) T(
     376        boost::forward<A1>( a1 )
    377377        );
    378378
    379379    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    385385}
    386386
    387387template< class T, class A1, class A2 >
    388 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2 )
     388typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
    389389{
    390390    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    391391
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    394394    void * pv = pd->address();
    395395
    396396    ::new( pv ) T(
    397         boost::detail::sp_forward<A1>( a1 ),
    398         boost::detail::sp_forward<A2>( a2 )
     397        boost::forward<A1>( a1 ),
     398        boost::forward<A2>( a2 )
    399399        );
    400400
    401401    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    407407}
    408408
    409409template< class T, class A, class A1, class A2 >
    410 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2 )
     410typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
    411411{
    412412    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    413413
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    415415
    416416    void * pv = pd->address();
    417417
    418     ::new( pv ) T( 
    419         boost::detail::sp_forward<A1>( a1 ),
    420         boost::detail::sp_forward<A2>( a2 )
     418    ::new( pv ) T(
     419        boost::forward<A1>( a1 ),
     420        boost::forward<A2>( a2 )
    421421        );
    422422
    423423    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    429429}
    430430
    431431template< class T, class A1, class A2, class A3 >
    432 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3 )
     432typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
    433433{
    434434    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    435435
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    438438    void * pv = pd->address();
    439439
    440440    ::new( pv ) T(
    441         boost::detail::sp_forward<A1>( a1 ),
    442         boost::detail::sp_forward<A2>( a2 ),
    443         boost::detail::sp_forward<A3>( a3 )
     441        boost::forward<A1>( a1 ),
     442        boost::forward<A2>( a2 ),
     443        boost::forward<A3>( a3 )
    444444        );
    445445
    446446    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    452452}
    453453
    454454template< class T, class A, class A1, class A2, class A3 >
    455 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 )
     455typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
    456456{
    457457    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    458458
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    460460
    461461    void * pv = pd->address();
    462462
    463     ::new( pv ) T( 
    464         boost::detail::sp_forward<A1>( a1 ),
    465         boost::detail::sp_forward<A2>( a2 ),
    466         boost::detail::sp_forward<A3>( a3 )
     463    ::new( pv ) T(
     464        boost::forward<A1>( a1 ),
     465        boost::forward<A2>( a2 ),
     466        boost::forward<A3>( a3 )
    467467        );
    468468
    469469    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    475475}
    476476
    477477template< class T, class A1, class A2, class A3, class A4 >
    478 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
     478typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
    479479{
    480480    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    481481
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    484484    void * pv = pd->address();
    485485
    486486    ::new( pv ) T(
    487         boost::detail::sp_forward<A1>( a1 ),
    488         boost::detail::sp_forward<A2>( a2 ),
    489         boost::detail::sp_forward<A3>( a3 ),
    490         boost::detail::sp_forward<A4>( a4 )
     487        boost::forward<A1>( a1 ),
     488        boost::forward<A2>( a2 ),
     489        boost::forward<A3>( a3 ),
     490        boost::forward<A4>( a4 )
    491491        );
    492492
    493493    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    499499}
    500500
    501501template< class T, class A, class A1, class A2, class A3, class A4 >
    502 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
     502typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
    503503{
    504504    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    505505
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    507507
    508508    void * pv = pd->address();
    509509
    510     ::new( pv ) T( 
    511         boost::detail::sp_forward<A1>( a1 ),
    512         boost::detail::sp_forward<A2>( a2 ),
    513         boost::detail::sp_forward<A3>( a3 ),
    514         boost::detail::sp_forward<A4>( a4 )
     510    ::new( pv ) T(
     511        boost::forward<A1>( a1 ),
     512        boost::forward<A2>( a2 ),
     513        boost::forward<A3>( a3 ),
     514        boost::forward<A4>( a4 )
    515515        );
    516516
    517517    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    523523}
    524524
    525525template< class T, class A1, class A2, class A3, class A4, class A5 >
    526 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
     526typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
    527527{
    528528    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    529529
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    532532    void * pv = pd->address();
    533533
    534534    ::new( pv ) T(
    535         boost::detail::sp_forward<A1>( a1 ),
    536         boost::detail::sp_forward<A2>( a2 ),
    537         boost::detail::sp_forward<A3>( a3 ),
    538         boost::detail::sp_forward<A4>( a4 ),
    539         boost::detail::sp_forward<A5>( a5 )
     535        boost::forward<A1>( a1 ),
     536        boost::forward<A2>( a2 ),
     537        boost::forward<A3>( a3 ),
     538        boost::forward<A4>( a4 ),
     539        boost::forward<A5>( a5 )
    540540        );
    541541
    542542    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    548548}
    549549
    550550template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
    551 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
     551typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
    552552{
    553553    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    554554
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    556556
    557557    void * pv = pd->address();
    558558
    559     ::new( pv ) T( 
    560         boost::detail::sp_forward<A1>( a1 ),
    561         boost::detail::sp_forward<A2>( a2 ),
    562         boost::detail::sp_forward<A3>( a3 ),
    563         boost::detail::sp_forward<A4>( a4 ),
    564         boost::detail::sp_forward<A5>( a5 )
     559    ::new( pv ) T(
     560        boost::forward<A1>( a1 ),
     561        boost::forward<A2>( a2 ),
     562        boost::forward<A3>( a3 ),
     563        boost::forward<A4>( a4 ),
     564        boost::forward<A5>( a5 )
    565565        );
    566566
    567567    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    573573}
    574574
    575575template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
    576 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
     576typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
    577577{
    578578    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    579579
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    582582    void * pv = pd->address();
    583583
    584584    ::new( pv ) T(
    585         boost::detail::sp_forward<A1>( a1 ),
    586         boost::detail::sp_forward<A2>( a2 ),
    587         boost::detail::sp_forward<A3>( a3 ),
    588         boost::detail::sp_forward<A4>( a4 ),
    589         boost::detail::sp_forward<A5>( a5 ),
    590         boost::detail::sp_forward<A6>( a6 )
     585        boost::forward<A1>( a1 ),
     586        boost::forward<A2>( a2 ),
     587        boost::forward<A3>( a3 ),
     588        boost::forward<A4>( a4 ),
     589        boost::forward<A5>( a5 ),
     590        boost::forward<A6>( a6 )
    591591        );
    592592
    593593    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    599599}
    600600
    601601template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
    602 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
     602typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
    603603{
    604604    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    605605
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    607607
    608608    void * pv = pd->address();
    609609
    610     ::new( pv ) T( 
    611         boost::detail::sp_forward<A1>( a1 ),
    612         boost::detail::sp_forward<A2>( a2 ),
    613         boost::detail::sp_forward<A3>( a3 ),
    614         boost::detail::sp_forward<A4>( a4 ),
    615         boost::detail::sp_forward<A5>( a5 ),
    616         boost::detail::sp_forward<A6>( a6 )
     610    ::new( pv ) T(
     611        boost::forward<A1>( a1 ),
     612        boost::forward<A2>( a2 ),
     613        boost::forward<A3>( a3 ),
     614        boost::forward<A4>( a4 ),
     615        boost::forward<A5>( a5 ),
     616        boost::forward<A6>( a6 )
    617617        );
    618618
    619619    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    625625}
    626626
    627627template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
    628 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
     628typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
    629629{
    630630    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    631631
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    634634    void * pv = pd->address();
    635635
    636636    ::new( pv ) T(
    637         boost::detail::sp_forward<A1>( a1 ),
    638         boost::detail::sp_forward<A2>( a2 ),
    639         boost::detail::sp_forward<A3>( a3 ),
    640         boost::detail::sp_forward<A4>( a4 ),
    641         boost::detail::sp_forward<A5>( a5 ),
    642         boost::detail::sp_forward<A6>( a6 ),
    643         boost::detail::sp_forward<A7>( a7 )
     637        boost::forward<A1>( a1 ),
     638        boost::forward<A2>( a2 ),
     639        boost::forward<A3>( a3 ),
     640        boost::forward<A4>( a4 ),
     641        boost::forward<A5>( a5 ),
     642        boost::forward<A6>( a6 ),
     643        boost::forward<A7>( a7 )
    644644        );
    645645
    646646    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    652652}
    653653
    654654template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
    655 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
     655typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
    656656{
    657657    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    658658
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    660660
    661661    void * pv = pd->address();
    662662
    663     ::new( pv ) T( 
    664         boost::detail::sp_forward<A1>( a1 ),
    665         boost::detail::sp_forward<A2>( a2 ),
    666         boost::detail::sp_forward<A3>( a3 ),
    667         boost::detail::sp_forward<A4>( a4 ),
    668         boost::detail::sp_forward<A5>( a5 ),
    669         boost::detail::sp_forward<A6>( a6 ),
    670         boost::detail::sp_forward<A7>( a7 )
     663    ::new( pv ) T(
     664        boost::forward<A1>( a1 ),
     665        boost::forward<A2>( a2 ),
     666        boost::forward<A3>( a3 ),
     667        boost::forward<A4>( a4 ),
     668        boost::forward<A5>( a5 ),
     669        boost::forward<A6>( a6 ),
     670        boost::forward<A7>( a7 )
    671671        );
    672672
    673673    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    679679}
    680680
    681681template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
    682 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
     682typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
    683683{
    684684    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    685685
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    688688    void * pv = pd->address();
    689689
    690690    ::new( pv ) T(
    691         boost::detail::sp_forward<A1>( a1 ),
    692         boost::detail::sp_forward<A2>( a2 ),
    693         boost::detail::sp_forward<A3>( a3 ),
    694         boost::detail::sp_forward<A4>( a4 ),
    695         boost::detail::sp_forward<A5>( a5 ),
    696         boost::detail::sp_forward<A6>( a6 ),
    697         boost::detail::sp_forward<A7>( a7 ),
    698         boost::detail::sp_forward<A8>( a8 )
     691        boost::forward<A1>( a1 ),
     692        boost::forward<A2>( a2 ),
     693        boost::forward<A3>( a3 ),
     694        boost::forward<A4>( a4 ),
     695        boost::forward<A5>( a5 ),
     696        boost::forward<A6>( a6 ),
     697        boost::forward<A7>( a7 ),
     698        boost::forward<A8>( a8 )
    699699        );
    700700
    701701    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    707707}
    708708
    709709template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
    710 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
     710typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
    711711{
    712712    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    713713
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    715715
    716716    void * pv = pd->address();
    717717
    718     ::new( pv ) T( 
    719         boost::detail::sp_forward<A1>( a1 ),
    720         boost::detail::sp_forward<A2>( a2 ),
    721         boost::detail::sp_forward<A3>( a3 ),
    722         boost::detail::sp_forward<A4>( a4 ),
    723         boost::detail::sp_forward<A5>( a5 ),
    724         boost::detail::sp_forward<A6>( a6 ),
    725         boost::detail::sp_forward<A7>( a7 ),
    726         boost::detail::sp_forward<A8>( a8 )
     718    ::new( pv ) T(
     719        boost::forward<A1>( a1 ),
     720        boost::forward<A2>( a2 ),
     721        boost::forward<A3>( a3 ),
     722        boost::forward<A4>( a4 ),
     723        boost::forward<A5>( a5 ),
     724        boost::forward<A6>( a6 ),
     725        boost::forward<A7>( a7 ),
     726        boost::forward<A8>( a8 )
    727727        );
    728728
    729729    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    735735}
    736736
    737737template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
    738 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
     738typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
    739739{
    740740    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    741741
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    744744    void * pv = pd->address();
    745745
    746746    ::new( pv ) T(
    747         boost::detail::sp_forward<A1>( a1 ),
    748         boost::detail::sp_forward<A2>( a2 ),
    749         boost::detail::sp_forward<A3>( a3 ),
    750         boost::detail::sp_forward<A4>( a4 ),
    751         boost::detail::sp_forward<A5>( a5 ),
    752         boost::detail::sp_forward<A6>( a6 ),
    753         boost::detail::sp_forward<A7>( a7 ),
    754         boost::detail::sp_forward<A8>( a8 ),
    755         boost::detail::sp_forward<A9>( a9 )
     747        boost::forward<A1>( a1 ),
     748        boost::forward<A2>( a2 ),
     749        boost::forward<A3>( a3 ),
     750        boost::forward<A4>( a4 ),
     751        boost::forward<A5>( a5 ),
     752        boost::forward<A6>( a6 ),
     753        boost::forward<A7>( a7 ),
     754        boost::forward<A8>( a8 ),
     755        boost::forward<A9>( a9 )
    756756        );
    757757
    758758    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&  
    764764}
    765765
    766766template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
    767 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
     767typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
    768768{
    769769    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    770770
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    772772
    773773    void * pv = pd->address();
    774774
    775     ::new( pv ) T( 
    776         boost::detail::sp_forward<A1>( a1 ),
    777         boost::detail::sp_forward<A2>( a2 ),
    778         boost::detail::sp_forward<A3>( a3 ),
    779         boost::detail::sp_forward<A4>( a4 ),
    780         boost::detail::sp_forward<A5>( a5 ),
    781         boost::detail::sp_forward<A6>( a6 ),
    782         boost::detail::sp_forward<A7>( a7 ),
    783         boost::detail::sp_forward<A8>( a8 ),
    784         boost::detail::sp_forward<A9>( a9 )
     775    ::new( pv ) T(
     776        boost::forward<A1>( a1 ),
     777        boost::forward<A2>( a2 ),
     778        boost::forward<A3>( a3 ),
     779        boost::forward<A4>( a4 ),
     780        boost::forward<A5>( a5 ),
     781        boost::forward<A6>( a6 ),
     782        boost::forward<A7>( a7 ),
     783        boost::forward<A8>( a8 ),
     784        boost::forward<A9>( a9 )
    785785        );
    786786
    787787    pd->set_initialized();
    typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a,  
    792792    return boost::shared_ptr< T >( pt, pt2 );
    793793}
    794794
    795 #else // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
    796 
    797 // C++03 version
    798 
    799 template< class T, class A1 >
    800 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 )
    801 {
    802     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    803 
    804     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    805 
    806     void * pv = pd->address();
    807 
    808     ::new( pv ) T( a1 );
    809     pd->set_initialized();
    810 
    811     T * pt2 = static_cast< T* >( pv );
    812 
    813     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    814     return boost::shared_ptr< T >( pt, pt2 );
    815 }
    816 
    817 template< class T, class A, class A1 >
    818 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1 )
    819 {
    820     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    821 
    822     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    823 
    824     void * pv = pd->address();
    825 
    826     ::new( pv ) T( a1 );
    827     pd->set_initialized();
    828 
    829     T * pt2 = static_cast< T* >( pv );
    830 
    831     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    832     return boost::shared_ptr< T >( pt, pt2 );
    833 }
    834 
    835 template< class T, class A1, class A2 >
    836 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2 )
    837 {
    838     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    839 
    840     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    841 
    842     void * pv = pd->address();
    843 
    844     ::new( pv ) T( a1, a2 );
    845     pd->set_initialized();
    846 
    847     T * pt2 = static_cast< T* >( pv );
    848 
    849     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    850     return boost::shared_ptr< T >( pt, pt2 );
    851 }
    852 
    853 template< class T, class A, class A1, class A2 >
    854 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2 )
    855 {
    856     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    857 
    858     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    859 
    860     void * pv = pd->address();
    861 
    862     ::new( pv ) T( a1, a2 );
    863     pd->set_initialized();
    864 
    865     T * pt2 = static_cast< T* >( pv );
    866 
    867     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    868     return boost::shared_ptr< T >( pt, pt2 );
    869 }
    870 
    871 template< class T, class A1, class A2, class A3 >
    872 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )
    873 {
    874     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    875 
    876     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    877 
    878     void * pv = pd->address();
    879 
    880     ::new( pv ) T( a1, a2, a3 );
    881     pd->set_initialized();
    882 
    883     T * pt2 = static_cast< T* >( pv );
    884 
    885     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    886     return boost::shared_ptr< T >( pt, pt2 );
    887 }
    888 
    889 template< class T, class A, class A1, class A2, class A3 >
    890 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )
    891 {
    892     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    893 
    894     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    895 
    896     void * pv = pd->address();
    897 
    898     ::new( pv ) T( a1, a2, a3 );
    899     pd->set_initialized();
    900 
    901     T * pt2 = static_cast< T* >( pv );
    902 
    903     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    904     return boost::shared_ptr< T >( pt, pt2 );
    905 }
    906 
    907 template< class T, class A1, class A2, class A3, class A4 >
    908 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
    909 {
    910     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    911 
    912     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    913 
    914     void * pv = pd->address();
    915 
    916     ::new( pv ) T( a1, a2, a3, a4 );
    917     pd->set_initialized();
    918 
    919     T * pt2 = static_cast< T* >( pv );
    920 
    921     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    922     return boost::shared_ptr< T >( pt, pt2 );
    923 }
    924 
    925 template< class T, class A, class A1, class A2, class A3, class A4 >
    926 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
    927 {
    928     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    929 
    930     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    931 
    932     void * pv = pd->address();
    933 
    934     ::new( pv ) T( a1, a2, a3, a4 );
    935     pd->set_initialized();
    936 
    937     T * pt2 = static_cast< T* >( pv );
    938 
    939     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    940     return boost::shared_ptr< T >( pt, pt2 );
    941 }
    942 
    943 template< class T, class A1, class A2, class A3, class A4, class A5 >
    944 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
    945 {
    946     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    947 
    948     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    949 
    950     void * pv = pd->address();
    951 
    952     ::new( pv ) T( a1, a2, a3, a4, a5 );
    953     pd->set_initialized();
    954 
    955     T * pt2 = static_cast< T* >( pv );
    956 
    957     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    958     return boost::shared_ptr< T >( pt, pt2 );
    959 }
    960 
    961 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
    962 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
    963 {
    964     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    965 
    966     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    967 
    968     void * pv = pd->address();
    969 
    970     ::new( pv ) T( a1, a2, a3, a4, a5 );
    971     pd->set_initialized();
    972 
    973     T * pt2 = static_cast< T* >( pv );
    974 
    975     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    976     return boost::shared_ptr< T >( pt, pt2 );
    977 }
    978 
    979 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
    980 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
    981 {
    982     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    983 
    984     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    985 
    986     void * pv = pd->address();
    987 
    988     ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
    989     pd->set_initialized();
    990 
    991     T * pt2 = static_cast< T* >( pv );
    992 
    993     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    994     return boost::shared_ptr< T >( pt, pt2 );
    995 }
    996 
    997 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
    998 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
    999 {
    1000     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    1001 
    1002     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    1003 
    1004     void * pv = pd->address();
    1005 
    1006     ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
    1007     pd->set_initialized();
    1008 
    1009     T * pt2 = static_cast< T* >( pv );
    1010 
    1011     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    1012     return boost::shared_ptr< T >( pt, pt2 );
    1013 }
    1014 
    1015 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
    1016 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
    1017 {
    1018     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    1019 
    1020     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    1021 
    1022     void * pv = pd->address();
    1023 
    1024     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
    1025     pd->set_initialized();
    1026 
    1027     T * pt2 = static_cast< T* >( pv );
    1028 
    1029     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    1030     return boost::shared_ptr< T >( pt, pt2 );
    1031 }
    1032 
    1033 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
    1034 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
    1035 {
    1036     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    1037 
    1038     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    1039 
    1040     void * pv = pd->address();
    1041 
    1042     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
    1043     pd->set_initialized();
    1044 
    1045     T * pt2 = static_cast< T* >( pv );
    1046 
    1047     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    1048     return boost::shared_ptr< T >( pt, pt2 );
    1049 }
    1050 
    1051 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
    1052 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
    1053 {
    1054     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    1055 
    1056     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    1057 
    1058     void * pv = pd->address();
    1059 
    1060     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
    1061     pd->set_initialized();
    1062 
    1063     T * pt2 = static_cast< T* >( pv );
    1064 
    1065     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    1066     return boost::shared_ptr< T >( pt, pt2 );
    1067 }
    1068 
    1069 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
    1070 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
    1071 {
    1072     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    1073 
    1074     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    1075 
    1076     void * pv = pd->address();
    1077 
    1078     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
    1079     pd->set_initialized();
    1080 
    1081     T * pt2 = static_cast< T* >( pv );
    1082 
    1083     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    1084     return boost::shared_ptr< T >( pt, pt2 );
    1085 }
    1086 
    1087 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
    1088 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
    1089 {
    1090     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
    1091 
    1092     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    1093 
    1094     void * pv = pd->address();
    1095 
    1096     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
    1097     pd->set_initialized();
    1098 
    1099     T * pt2 = static_cast< T* >( pv );
    1100 
    1101     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    1102     return boost::shared_ptr< T >( pt, pt2 );
    1103 }
    1104 
    1105 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
    1106 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
    1107 {
    1108     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
    1109 
    1110     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
    1111 
    1112     void * pv = pd->address();
    1113 
    1114     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
    1115     pd->set_initialized();
    1116 
    1117     T * pt2 = static_cast< T* >( pv );
    1118 
    1119     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    1120     return boost::shared_ptr< T >( pt, pt2 );
    1121 }
    1122 
    1123 #endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
    1124 
    1125795#endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
    1126796
    1127797#undef BOOST_SP_MSD