diff --git a/alib2std/src/extensions/variant.hpp b/alib2std/src/extensions/variant.hpp index b6027894bb3f7c41e778fbef3a329b685e18ce37..e7a6e82be6c1fc32ed7207c1302a13c14d70f8bd 100644 --- a/alib2std/src/extensions/variant.hpp +++ b/alib2std/src/extensions/variant.hpp @@ -242,8 +242,13 @@ public: helper_t::move(old.type_id, &old.data, &this->data); } - //assignment operator - variant<Ts...>& operator= (variant<Ts...> old) noexcept { + // copy assignment operator + variant<Ts...>& operator =( const variant<Ts...> & other ) { + return this->operator =( variant <Ts...> ( other ) ); + } + + // move assignment operator + variant<Ts...>& operator= (variant<Ts...> && old) noexcept { std::swap(this->type_id, old.type_id); std::swap(this->data, old.data); diff --git a/alib2std/test-src/extensions/VariantTest.cpp b/alib2std/test-src/extensions/VariantTest.cpp index 6d7372f346c3f613164add922599603378e79840..5d28736c61bbde86d9aa27d54fa7756d7a81b1a4 100644 --- a/alib2std/test-src/extensions/VariantTest.cpp +++ b/alib2std/test-src/extensions/VariantTest.cpp @@ -168,3 +168,8 @@ void VariantTest::testSizeT() { CPPUNIT_ASSERT ( b.is < int > ( ) ); CPPUNIT_ASSERT ( c.is < void > ( ) ); } + +void VariantTest::testMoveSemantics() { + CPPUNIT_ASSERT ( ( std::is_nothrow_move_constructible < std::variant < void, int, size_t > >::value ) ); + CPPUNIT_ASSERT ( ( std::is_move_constructible < std::variant < void, int, size_t > >::value && std::is_move_assignable < std::variant < void, int, size_t > >::value ) ); +} diff --git a/alib2std/test-src/extensions/VariantTest.h b/alib2std/test-src/extensions/VariantTest.h index c4f07ed6f19b3d608ccc069922d1ea4b74a3a96d..20914770458aaa1d01d9b4325da38a4bb5a2697e 100644 --- a/alib2std/test-src/extensions/VariantTest.h +++ b/alib2std/test-src/extensions/VariantTest.h @@ -14,6 +14,7 @@ class VariantTest : public CppUnit::TestFixture CPPUNIT_TEST( testVariantDefault ); CPPUNIT_TEST( testVariantSameTypes ); CPPUNIT_TEST( testSizeT ); + CPPUNIT_TEST( testMoveSemantics ); CPPUNIT_TEST_SUITE_END(); public: @@ -76,6 +77,7 @@ public: void testVariantDefault(); void testVariantSameTypes(); void testSizeT(); + void testMoveSemantics(); }; namespace std {