123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // make_shared_move_emulation_test.cpp - a test of make_shared
- // semi-perfect forwarding of constructor arguments when using a C++03
- // compiler with move emulation.
- // Note the "semi": it means moving temporaries (real r-values) doesn't work.
- //
- // Copyright 2016 Giel van Schijndel
- //
- // Distributed under the Boost Software License, Version 1.0.
- // See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/make_shared.hpp>
- #include <boost/move/core.hpp>
- #include <boost/move/utility_core.hpp>
- #include <boost/shared_ptr.hpp>
- class movearg
- {
- private:
- BOOST_MOVABLE_BUT_NOT_COPYABLE(movearg)
- public:
- movearg()
- {}
- movearg(BOOST_RV_REF(movearg))
- {}
- movearg& operator=(BOOST_RV_REF(movearg))
- {
- return *this;
- }
- };
- class ByVal
- {
- public:
- ByVal(movearg) {}
- };
- class ByRef
- {
- public:
- enum constructor_id
- {
- move_constructor,
- const_ref_constructor
- };
- ByRef(BOOST_RV_REF(movearg)): constructed_by_(move_constructor)
- {}
- ByRef(const movearg &arg): constructed_by_(const_ref_constructor)
- {}
- constructor_id constructed_by_;
- };
- int main()
- {
- {
- movearg a;
- boost::shared_ptr< ByVal > x = boost::make_shared< ByVal >(boost::move(a));
- }
- {
- movearg a;
- boost::shared_ptr< ByRef > x = boost::make_shared< ByRef >(boost::move(a));
- BOOST_TEST( x->constructed_by_ == ByRef::move_constructor);
- }
- #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
- {
- boost::shared_ptr< ByVal > x = boost::make_shared< ByVal >(movearg());
- boost::shared_ptr< ByRef > y = boost::make_shared< ByRef >(movearg());
- BOOST_TEST( y->constructed_by_ == ByRef::move_constructor);
- }
- #endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
- {
- const movearg ca;
- boost::shared_ptr< ByRef > x = boost::make_shared< ByRef >(ca);
- BOOST_TEST( x->constructed_by_ == ByRef::const_ref_constructor);
- }
- return boost::report_errors();
- }
|