Do the operator= SFINAE in the return type for optional,
authorVille Voutilainen <ville.voutilainen@gmail.com>
Thu, 20 Oct 2016 11:54:52 +0000 (14:54 +0300)
committerVille Voutilainen <ville@gcc.gnu.org>
Thu, 20 Oct 2016 11:54:52 +0000 (14:54 +0300)
not in the template parameters.
* include/std/optional (operator=(_Up&&)): Move SFINAE
from template parameters to the return type.
(operator=(const optional<_Up>&)): Likewise.
(operator=(optional<_Up>&&)): Likewise.

From-SVN: r241372

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/optional

index f0360c5b8a0c88b47fba51565c1ecbe11f879873..378e9fad1457bec7dd26e8e0fba91bb2a6968712 100644 (file)
@@ -1,3 +1,12 @@
+2016-10-20  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       Do the operator= SFINAE in the return type for optional,
+       not in the template parameters.
+       * include/std/optional (operator=(_Up&&)): Move SFINAE
+       from template parameters to the return type.
+       (operator=(const optional<_Up>&)): Likewise.
+       (operator=(optional<_Up>&&)): Likewise.
+
 2016-10-20  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/bits/allocator.h: Remove trailing whitespace, tab-indent.
index 21210ab653250e74a6e1878830d22c07a00a33ca..f272876fd8b3b9908472ddf7392a9f87b1244ec9 100644 (file)
@@ -568,15 +568,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         return *this;
       }
 
-      template<typename _Up = _Tp,
-               enable_if_t<__and_<
-                            __not_<is_same<optional<_Tp>, decay_t<_Up>>>,
-                            is_constructible<_Tp, _Up>,
-                            __not_<__and_<is_scalar<_Tp>,
-                                          is_same<_Tp, decay_t<_Up>>>>,
-                            is_assignable<_Tp&, _Up>>::value,
-                          bool> = true>
-        optional&
+      template<typename _Up = _Tp>
+        enable_if_t<__and_<
+                     __not_<is_same<optional<_Tp>, decay_t<_Up>>>,
+                     is_constructible<_Tp, _Up>,
+                     __not_<__and_<is_scalar<_Tp>,
+                                   is_same<_Tp, decay_t<_Up>>>>,
+                     is_assignable<_Tp&, _Up>>::value,
+                   optional&>
         operator=(_Up&& __u)
         {
           if (this->_M_is_engaged())
@@ -587,16 +586,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
           return *this;
         }
 
-      template<typename _Up,
-               enable_if_t<__and_<
-                            __not_<is_same<_Tp, _Up>>,
-                            is_constructible<_Tp, const _Up&>,
-                            is_assignable<_Tp&, _Up>,
-                            __not_<__converts_from_optional<_Tp, _Up>>,
-                            __not_<__assigns_from_optional<_Tp, _Up>>
-                            >::value,
-                          bool> = true>
-        optional&
+      template<typename _Up>
+       enable_if_t<__and_<
+                     __not_<is_same<_Tp, _Up>>,
+                     is_constructible<_Tp, const _Up&>,
+                     is_assignable<_Tp&, _Up>,
+                     __not_<__converts_from_optional<_Tp, _Up>>,
+                     __not_<__assigns_from_optional<_Tp, _Up>>
+                     >::value,
+                   optional&>
         operator=(const optional<_Up>& __u)
         {
           if (__u)
@@ -613,16 +611,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
           return *this;
         }
 
-      template<typename _Up,
-              enable_if_t<__and_<
-                            __not_<is_same<_Tp, _Up>>,
-                            is_constructible<_Tp, _Up>,
-                            is_assignable<_Tp&, _Up>,
-                            __not_<__converts_from_optional<_Tp, _Up>>,
-                            __not_<__assigns_from_optional<_Tp, _Up>>
-                            >::value,
-                          bool> = true>
-        optional&
+      template<typename _Up>
+       enable_if_t<__and_<
+                     __not_<is_same<_Tp, _Up>>,
+                     is_constructible<_Tp, _Up>,
+                     is_assignable<_Tp&, _Up>,
+                     __not_<__converts_from_optional<_Tp, _Up>>,
+                     __not_<__assigns_from_optional<_Tp, _Up>>
+                     >::value,
+                   optional&>
         operator=(optional<_Up>&& __u)
         {
           if (__u)