From: Hans Fugal <fugalh@fb.com>
Date: Thu, 30 Apr 2015 22:09:05 +0000 (-0700)
Subject: Do not construct a Future<T> from a Future<Something> value
X-Git-Tag: v0.38.0~26
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5b531cbb45884ad8a27891cf3170cd0286c3183c;p=folly.git

Do not construct a Future<T> from a Future<Something> value

Summary: The value constructor can be nice. But when it matches on Future<Something> it just confuses everybody.

Test Plan:
building and running tests
contbuild

Reviewed By: jsedgwick@fb.com

Subscribers: exa, folly-diffs@, jsedgwick, yfeldblum, chalfant

FB internal diff: D2036455

Tasks: 6925951

Signature: t1:2036455:1430423503:73906f748318c4ebec13f45ad3761f104e2ef888
---

diff --git a/folly/futures/Future-inl.h b/folly/futures/Future-inl.h
index f6abe7b4..927a3142 100644
--- a/folly/futures/Future-inl.h
+++ b/folly/futures/Future-inl.h
@@ -44,7 +44,8 @@ Future<T>& Future<T>::operator=(Future<T>&& other) noexcept {
 }
 
 template <class T>
-template <class T2>
+template <class T2,
+          typename std::enable_if<!isFuture<T2>::value, void*>::type>
 Future<T>::Future(T2&& val) : core_(nullptr) {
   Promise<T> p;
   p.setValue(std::forward<T2>(val));
diff --git a/folly/futures/Future.h b/folly/futures/Future.h
index cc0bd36a..06572c63 100644
--- a/folly/futures/Future.h
+++ b/folly/futures/Future.h
@@ -56,7 +56,9 @@ class Future {
 
   /// Construct a Future from a value (perfect forwarding)
   /* implicit */
-  template <class T2 = T> Future(T2&& val);
+  template <class T2 = T,
+            typename std::enable_if<!isFuture<T2>::value, void*>::type = nullptr>
+  Future(T2&& val);
 
   template <class T2 = T,
             typename std::enable_if<