// Copyright Louis Dionne 2013-2022 // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include namespace hana = boost::hana; struct MoveOnly { int data_; MoveOnly(MoveOnly const&) = delete; MoveOnly& operator=(MoveOnly const&) = delete; MoveOnly(int data = 1) : data_(data) { } MoveOnly(MoveOnly&& x) : data_(x.data_) { x.data_ = 0; } MoveOnly& operator=(MoveOnly&& x) { data_ = x.data_; x.data_ = 0; return *this; } bool operator==(const MoveOnly& x) const { return data_ == x.data_; } }; struct MoveOnlyDerived : MoveOnly { MoveOnlyDerived(MoveOnlyDerived&&) = default; MoveOnlyDerived(int data = 1) : MoveOnly(data) { } }; constexpr auto in_constexpr_context(int a, short b) { hana::pair p1(a, b); hana::pair p2; hana::pair p3; p2 = std::move(p1); p3 = std::move(p2); return p3; } int main() { // from pair to pair { hana::pair p1(MoveOnly{3}, 4); hana::pair p2; p2 = std::move(p1); BOOST_HANA_RUNTIME_CHECK(hana::first(p2) == MoveOnly{3}); BOOST_HANA_RUNTIME_CHECK(hana::second(p2) == 4); } // from pair to pair { hana::pair p1(MoveOnlyDerived{3}, 4); hana::pair p2; p2 = std::move(p1); BOOST_HANA_RUNTIME_CHECK(hana::first(p2) == MoveOnly{3}); BOOST_HANA_RUNTIME_CHECK(hana::second(p2) == 4); } // make sure that also works in a constexpr context // (test fails under GCC <= 6 due to buggy constexpr) #if BOOST_HANA_CONFIG_GCC >= BOOST_HANA_CONFIG_VERSION(7, 0, 0) { constexpr auto p = in_constexpr_context(3, 4); static_assert(hana::first(p) == 3, ""); static_assert(hana::second(p) == 4, ""); } #endif }