diff mbox

[v3] Do the operator= SFINAE in the return type for optional, not in the template parameters.

Message ID CAFk2RUbOFd8zbrWgB+gHGEYG8hmG8W9eySivbVobxqxny=Utnw@mail.gmail.com
State New
Headers show

Commit Message

Ville Voutilainen Oct. 19, 2016, 7:35 p.m. UTC
Tested on Linux-x64.

2016-10-19  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.

Comments

Jonathan Wakely Oct. 20, 2016, 10:54 a.m. UTC | #1
On 19/10/16 22:35 +0300, Ville Voutilainen wrote:
>    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.

OK.
diff mbox

Patch

diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional
index 21210ab..f272876 100644
--- a/libstdc++-v3/include/std/optional
+++ b/libstdc++-v3/include/std/optional
@@ -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)