// // (C) Copyright Thomas Klimpel 2010. // 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 "optimized_move_wrapper.hpp" // A copyable and movable class using the optimized move emulation. class optimized_copy_movable { BOOST_COPYABLE_AND_MOVABLE(optimized_copy_movable) int track_constr; int track_assign; public: optimized_copy_movable() : track_constr(0), track_assign(0) {} optimized_copy_movable(int a1, int a2) : track_constr(a1), track_assign(a2) {} optimized_copy_movable(const optimized_copy_movable &ocm) { track_constr = ocm.track_constr; track_assign = ocm.track_assign; } optimized_copy_movable(BOOST_RV_REF(optimized_copy_movable) ocm) { track_constr = ocm.track_constr; ocm.track_constr = 0; track_assign = ocm.track_assign; ocm.track_assign = 0; } optimized_copy_movable & operator=(BOOST_RV_REF(optimized_copy_movable) ocm) { track_constr = ocm.track_constr; ocm.track_constr = 0; track_assign = ocm.track_assign; ocm.track_assign = 0; return *this; } optimized_copy_movable & operator=(BOOST_COPY_ASSIGN_REF(optimized_copy_movable) ocm) { track_constr = ocm.track_constr; track_assign = ocm.track_assign; return *this; } }; // A class using the above optimized class as member without the optimized move wrapper class unexpected_assignment_operator { optimized_copy_movable ocm; }; // A class using the above optimized class as member with the optimized move wrapper class normal_assignment_operator { BOOST_OPTIMIZED_MOVE_WRAPPER(optimized_copy_movable) ocm; public: normal_assignment_operator() {} normal_assignment_operator(int a, int b) : ocm(a, b) {} }; int main() { unexpected_assignment_operator u1, u2; unexpected_assignment_operator& ru(u1); const unexpected_assignment_operator& cru(u1); u2 = ru; // the following line doesn't compile, except on MSVC //u2 = unexpected_assignment_operator(); // the following line doesn't compile //u2 = cru; normal_assignment_operator n1(2,3), n2; normal_assignment_operator& rn(n1); const normal_assignment_operator& crn(n1); n2 = rn; n2 = normal_assignment_operator(); n2 = crn; return 0; }