Brian Silverman | 1f5d398 | 2018-08-04 23:37:52 -0700 | [diff] [blame^] | 1 | ////////////////////////////////////////////////////////////////////////////// |
| 2 | // |
| 3 | // (C) Copyright Ion Gaztanaga 2014-2014. |
| 4 | // Distributed under the Boost Software License, Version 1.0. |
| 5 | // (See accompanying file LICENSE_1_0.txt or copy at |
| 6 | // http://www.boost.org/LICENSE_1_0.txt) |
| 7 | // |
| 8 | // See http://www.boost.org/libs/move for documentation. |
| 9 | // |
| 10 | ////////////////////////////////////////////////////////////////////////////// |
| 11 | |
| 12 | #include <boost/move/detail/config_begin.hpp> |
| 13 | #include <boost/move/detail/meta_utils_core.hpp> |
| 14 | |
| 15 | #include <boost/move/move.hpp> |
| 16 | |
| 17 | //[template_assign_example_foo_bar |
| 18 | |
| 19 | class Foo |
| 20 | { |
| 21 | BOOST_COPYABLE_AND_MOVABLE(Foo) |
| 22 | |
| 23 | public: |
| 24 | int i; |
| 25 | explicit Foo(int val) : i(val) {} |
| 26 | |
| 27 | Foo(BOOST_RV_REF(Foo) obj) : i(obj.i) {} |
| 28 | |
| 29 | Foo& operator=(BOOST_RV_REF(Foo) rhs) |
| 30 | { i = rhs.i; rhs.i = 0; return *this; } |
| 31 | |
| 32 | Foo& operator=(BOOST_COPY_ASSIGN_REF(Foo) rhs) |
| 33 | { i = rhs.i; return *this; } //(1) |
| 34 | |
| 35 | template<class U> //(*) TEMPLATED ASSIGNMENT, potential problem |
| 36 | //<- |
| 37 | #if 1 |
| 38 | typename ::boost::move_detail::disable_if_same<U, Foo, Foo&>::type |
| 39 | operator=(const U& rhs) |
| 40 | #else |
| 41 | //-> |
| 42 | Foo& operator=(const U& rhs) |
| 43 | //<- |
| 44 | #endif |
| 45 | //-> |
| 46 | { i = -rhs.i; return *this; } //(2) |
| 47 | }; |
| 48 | //] |
| 49 | |
| 50 | struct Bar |
| 51 | { |
| 52 | int i; |
| 53 | explicit Bar(int val) : i(val) {} |
| 54 | }; |
| 55 | |
| 56 | |
| 57 | //<- |
| 58 | #ifdef NDEBUG |
| 59 | #undef NDEBUG |
| 60 | #endif |
| 61 | //-> |
| 62 | #include <cassert> |
| 63 | |
| 64 | int main() |
| 65 | { |
| 66 | //[template_assign_example_main |
| 67 | Foo foo1(1); |
| 68 | //<- |
| 69 | assert(foo1.i == 1); |
| 70 | //-> |
| 71 | Foo foo2(2); |
| 72 | //<- |
| 73 | assert(foo2.i == 2); |
| 74 | Bar bar(3); |
| 75 | assert(bar.i == 3); |
| 76 | //-> |
| 77 | foo2 = foo1; // Calls (1) in C++11 but (2) in C++98 |
| 78 | //<- |
| 79 | assert(foo2.i == 1); |
| 80 | assert(foo1.i == 1); //Fails in C++98 unless workaround is applied |
| 81 | foo1 = bar; |
| 82 | assert(foo1.i == -3); |
| 83 | foo2 = boost::move(foo1); |
| 84 | assert(foo1.i == 0); |
| 85 | assert(foo2.i == -3); |
| 86 | //-> |
| 87 | const Foo foo5(5); |
| 88 | foo2 = foo5; // Calls (1) in C++11 but (2) in C++98 |
| 89 | //<- |
| 90 | assert(foo2.i == 5); //Fails in C++98 unless workaround is applied |
| 91 | assert(foo5.i == 5); |
| 92 | //-> |
| 93 | //] |
| 94 | return 0; |
| 95 | } |
| 96 | |
| 97 | |
| 98 | #include <boost/move/detail/config_end.hpp> |