From 1b0056303d9446eb3646b9e19fa91794580cfa66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Alexandre=20Boissonneault?= Date: Sat, 2 Dec 2017 19:12:22 -0500 Subject: [PATCH] Fixed copy and move operations on "expected { // This class manages conditionally having a trivial copy constructor // This specialization is for when T is trivially copy constructible -template +template struct expected_copy_base : expected_operations_base { using expected_operations_base::expected_operations_base; }; @@ -612,7 +612,15 @@ struct expected_copy_base : expected_operations_base { } expected_copy_base(expected_copy_base &&rhs) = default; - expected_copy_base &operator=(const expected_copy_base &rhs) = default; + expected_copy_base &operator=(const expected_copy_base &rhs) { + if (rhs.has_value()) { + this->construct(rhs.get()); + } + else { + this->construct_error(rhs.geterr()); + } + return *this; + } expected_copy_base &operator=(expected_copy_base &&rhs) = default; }; @@ -718,7 +726,7 @@ template ::value && std::is_copy_constructible::value), bool EnableMove = (std::is_move_constructible::value && - std::is_move_constructible::value)> + std::is_move_constructible::value)> struct expected_delete_ctor_base { expected_delete_ctor_base() = default; expected_delete_ctor_base(const expected_delete_ctor_base &) = default; diff --git a/tests/constructors.cpp b/tests/constructors.cpp index 817797b..420c8bd 100644 --- a/tests/constructors.cpp +++ b/tests/constructors.cpp @@ -59,4 +59,55 @@ TEST_CASE("Constructors", "[constructors]") { REQUIRE(std::get<1>(e->t) == 3); } + { + tl::expected e; + REQUIRE(std::is_default_constructible::value); + REQUIRE(std::is_copy_constructible::value); + REQUIRE(std::is_trivially_copy_constructible::value); + REQUIRE(std::is_move_constructible::value); + REQUIRE(std::is_trivially_move_constructible::value); + REQUIRE(std::is_copy_assignable::value); + REQUIRE(std::is_trivially_copy_assignable::value); + REQUIRE(std::is_move_assignable::value); + REQUIRE(std::is_trivially_move_assignable::value); + } + + { + tl::expected e; + REQUIRE(std::is_default_constructible::value); + REQUIRE(std::is_copy_constructible::value); + REQUIRE(!std::is_trivially_copy_constructible::value); + REQUIRE(std::is_move_constructible::value); + REQUIRE(!std::is_trivially_move_constructible::value); + REQUIRE(std::is_copy_assignable::value); + REQUIRE(!std::is_trivially_copy_assignable::value); + REQUIRE(std::is_move_assignable::value); + REQUIRE(!std::is_trivially_move_assignable::value); + } + + { + tl::expected e; + REQUIRE(std::is_default_constructible::value); + REQUIRE(std::is_copy_constructible::value); + REQUIRE(!std::is_trivially_copy_constructible::value); + REQUIRE(std::is_move_constructible::value); + REQUIRE(!std::is_trivially_move_constructible::value); + REQUIRE(std::is_copy_assignable::value); + REQUIRE(!std::is_trivially_copy_assignable::value); + REQUIRE(std::is_move_assignable::value); + REQUIRE(!std::is_trivially_move_assignable::value); + } + + { + tl::expected e; + REQUIRE(std::is_default_constructible::value); + REQUIRE(std::is_copy_constructible::value); + REQUIRE(!std::is_trivially_copy_constructible::value); + REQUIRE(std::is_move_constructible::value); + REQUIRE(!std::is_trivially_move_constructible::value); + REQUIRE(std::is_copy_assignable::value); + REQUIRE(!std::is_trivially_copy_assignable::value); + REQUIRE(std::is_move_assignable::value); + REQUIRE(!std::is_trivially_move_assignable::value); + } }