#include #include class base { int b_; BOOST_COPYABLE_AND_MOVABLE(base) public: base():b_(){} base(const base& b):b_(b.b_) { std::cout << "bcc" << std::endl; } base(BOOST_RV_REF(base) b):b_(b.b_) { std::cout << "bmc" << std::endl; } base& operator=(BOOST_COPY_ASSIGN_REF(base) b) { b_=b.b_; std::cout << "bca" << std::endl; } base& operator=(BOOST_RV_REF(base) b) { b_=b.b_; std::cout << "bma" << std::endl; } virtual void sideeffect() const { std::cout << "b_: " << b_ << std::endl; } virtual void sideeffect() { std::cout << "++b_: " << ++b_ << std::endl; } }; base createBase() { base b; b.sideeffect(); return b; } class derived : public base { int d_; BOOST_COPYABLE_AND_MOVABLE(derived) public: derived():base(),d_(){} derived(const derived& d):base(d), d_(d.d_) { std::cout << "dcc" << std::endl; } derived(BOOST_RV_REF(derived) d):base(boost::move(static_cast(d))), d_(d.d_) { std::cout << "dmc" << std::endl; } derived& operator=(BOOST_COPY_ASSIGN_REF(derived) d) { base::operator=(d); d_=d.d_; std::cout << "dca" << std::endl; } derived& operator=(BOOST_RV_REF(derived) d) { base::operator=(boost::move(static_cast(d))); d_=d.d_; std::cout << "dma" << std::endl; } virtual void sideeffect() const { std::cout << "d_: " << d_ << std::endl; } virtual void sideeffect() { std::cout << "++d_: " << ++d_ << std::endl; } }; derived createDerived() { derived d; d.sideeffect(); return d; } void nonsense(BOOST_COPY_ASSIGN_REF(base) rval) { std::cout << "const lref: "; rval.sideeffect(); } void nonsense(base& rval) { std::cout << "lref: "; rval.sideeffect(); } void nonsense(BOOST_RV_REF(base) rval) { std::cout << "rref: "; rval.sideeffect(); } #if defined(TRY_TEMPLATE_RV) template void nonsense(BOOST_RV_REF(T) rval) { std::cout << "template rref: "; rval.sideeffect(); } #elif defined(TRY_DERIVED_RV) void nonsense(BOOST_RV_REF(derived) rval) { std::cout << "derived rref: "; rval.sideeffect(); } #endif int main() { std::cout << std::endl << "base constructors: " << std::endl; base b = createDerived(); const base cb = createBase(); std::cout << std::endl << "base(), b, cb: " << std::endl; nonsense(base()); nonsense(b); nonsense(cb); std::cout << std::endl << "base assignments: " << std::endl; base bb(b); b = cb; b = boost::move(bb); bb = createBase(); std::cout << std::endl << "derived constructors: " << std::endl; derived d = createDerived(); const derived cd = createDerived(); std::cout << std::endl << "derived(), d, cd: " << std::endl; nonsense(derived()); nonsense(d); nonsense(cd); std::cout << std::endl << "derived assignments: " << std::endl; derived dd(d); d = cd; d = boost::move(dd); dd = createDerived(); std::cout << std::endl << "slicing assignments: " << std::endl; bb = cd; b = boost::move(d); b = createDerived(); return 0; }