diff --git a/src/util/optional.hpp b/src/util/optional.hpp index 0955ea99e720a24e1a02ea4926a838caec8ee2d7..ddf978d67b34a7698c07131b923bff62521633e3 100644 --- a/src/util/optional.hpp +++ b/src/util/optional.hpp @@ -332,22 +332,19 @@ struct optional<X&>: detail::optional_base<X&> { template <typename T> optional(optional<T&>& ot): base(ot.set,ot.ref()) {} - /* - template < - typename Y, - typename = typename std::enable_if<!detail::is_optional<Y>::value>::type> - */ template <typename Y> optional& operator=(Y& y) { set = true; - ref() = y; + data.construct(y); return *this; } template <typename Y> optional& operator=(optional<Y&>& o) { set = o.set; - data.construct(o); + if (o.set) { + data.construct(o.get()); + } return *this; } }; diff --git a/tests/test_optional.cpp b/tests/test_optional.cpp index aa13e870d205c19bf2e9a26b9f03b03eaeef866f..6240f53f3c4edf209aba54235ca29d9195fe50bd 100644 --- a/tests/test_optional.cpp +++ b/tests/test_optional.cpp @@ -88,6 +88,23 @@ TEST(optionalm,assign_returns) { EXPECT_EQ(&a,bp); } +TEST(optionalm,assign_reference) { + double a=3.0; + optional<double &> ar; + optional<double &> br; + + ar = a; + EXPECT_TRUE(ar); + *ar = 5.0; + EXPECT_EQ(5.0, a); + + br = ar; + EXPECT_TRUE(br); + + *br = 7.0; + EXPECT_EQ(7.0, a); +} + struct nomove { int value; @@ -148,7 +165,7 @@ TEST(optionalm,ctor_nocopy) { EXPECT_EQ(nocopy(6),b.get()); } -optional<double> odd_half(int n) { +static optional<double> odd_half(int n) { optional<double> h; if (n%2==1) h=n/2.0; return h;