fix util::optional copy/move constructors
authorJacob Lifshay <programmerjake@gmail.com>
Fri, 16 Jun 2017 22:45:45 +0000 (15:45 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Fri, 16 Jun 2017 22:45:45 +0000 (15:45 -0700)
src/util/optional.h

index 3186719ec3a3f637cea6c83ed1b4cfc7fee147ef..99b748d494876cbfeede1d7e5f89d7d0e24f6398 100644 (file)
@@ -402,6 +402,10 @@ public:
     using Base::reset;
     using Base::emplace;
     constexpr optional() noexcept = default;
+    constexpr optional(const optional &) noexcept(std::is_nothrow_copy_constructible<T>::value) =
+        default;
+    constexpr optional(optional &&) noexcept(std::is_nothrow_move_constructible<T>::value) =
+        default;
     template <typename U,
               typename = typename std::
                   enable_if<detail::optional_needs_conversion_constructors<T, U, const U &>()
@@ -468,8 +472,10 @@ public:
         : Base(in_place, std::forward<U>(value))
     {
     }
-    optional &operator=(const optional &) = default;
-    optional &operator=(optional &&) = default;
+    constexpr optional &operator=(const optional &) noexcept(
+        std::is_nothrow_copy_assignable<T>::value) = default;
+    constexpr optional &operator=(optional &&) noexcept(std::is_nothrow_move_assignable<T>::value) =
+        default;
     template <typename U = T,
               typename = typename std::
                   enable_if<!std::is_same<typename std::decay<U>::type, optional>::value