/*============================================================================= Copyright (c) 2012 Joel de Guzman 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 #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) #error "Valid only on compilers that support rvalues" #endif #include #include #include #include namespace test_detail { int copies = 0; void incr_copy() { copies++; } struct x { int i; x() : i(123) {} x(x&& rhs) : i(rhs.i) {} x& operator=(x&& rhs) { i = rhs.i; return *this; } x(x const& /*rhs*/) { incr_copy(); } x& operator=(x const& /*rhs*/) { incr_copy(); return *this; } }; typedef std::vector vector_type; extern bool disable_rvo; // to disable RVO vector_type generate_vec() { vector_type v; v.push_back(x()); if (disable_rvo) return v; return vector_type(); } template T move_me(T && val) { T r(std::move(val)); if (disable_rvo) return r; return T(); } typedef FUSION_SEQUENCE return_type; return_type generate() { return_type r(generate_vec()); if (disable_rvo) return r; return return_type(); } typedef FUSION_SEQUENCE2 return_type2; return_type2 generate2() { return_type2 r(generate_vec(), x()); if (disable_rvo) return r; return return_type2(); } } void test() { using namespace boost::fusion; using namespace test_detail; return_type v = move_me(generate()); BOOST_TEST(copies == 0); return_type2 v2 = move_me(generate2()); BOOST_TEST(copies == 0); v2 = move_me(generate2()); BOOST_TEST(copies == 0); std::cout << "Copies: " << copies << std::endl; } namespace test_detail { bool disable_rvo = true; }