////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2014-2014. // 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) // // See http://www.boost.org/libs/move for documentation. // ////////////////////////////////////////////////////////////////////////////// #include #include #include //[template_assign_example_foo_bar class Foo { BOOST_COPYABLE_AND_MOVABLE(Foo) public: int i; explicit Foo(int val) : i(val) {} Foo(BOOST_RV_REF(Foo) obj) : i(obj.i) {} Foo& operator=(BOOST_RV_REF(Foo) rhs) { i = rhs.i; rhs.i = 0; return *this; } Foo& operator=(BOOST_COPY_ASSIGN_REF(Foo) rhs) { i = rhs.i; return *this; } //(1) template //(*) TEMPLATED ASSIGNMENT, potential problem //<- #if 1 typename ::boost::move_detail::disable_if_same::type operator=(const U& rhs) #else //-> Foo& operator=(const U& rhs) //<- #endif //-> { i = -rhs.i; return *this; } //(2) }; //] struct Bar { int i; explicit Bar(int val) : i(val) {} }; //<- #ifdef NDEBUG #undef NDEBUG #endif //-> #include int main() { //[template_assign_example_main Foo foo1(1); //<- assert(foo1.i == 1); //-> Foo foo2(2); //<- assert(foo2.i == 2); Bar bar(3); assert(bar.i == 3); //-> foo2 = foo1; // Calls (1) in C++11 but (2) in C++98 //<- assert(foo2.i == 1); assert(foo1.i == 1); //Fails in C++98 unless workaround is applied foo1 = bar; assert(foo1.i == -3); foo2 = boost::move(foo1); assert(foo1.i == 0); assert(foo2.i == -3); //-> const Foo foo5(5); foo2 = foo5; // Calls (1) in C++11 but (2) in C++98 //<- assert(foo2.i == 5); //Fails in C++98 unless workaround is applied assert(foo5.i == 5); //-> //] return 0; } #include