cancel: Fix passing nullopt to constructor

It should be possible to use any of the Handle constructors in addition
to the new default constructor.

Change-Id: I384c5c8a9061d2fde4517bbd75c8b75b705ec1d3
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/stdplus/cancel.hpp b/src/stdplus/cancel.hpp
index 4b52e59..cb40c87 100644
--- a/src/stdplus/cancel.hpp
+++ b/src/stdplus/cancel.hpp
@@ -33,7 +33,8 @@
     Cancel() : detail::CancelHandle(std::nullopt)
     {
     }
-    explicit Cancel(Cancelable* c) : detail::CancelHandle(c)
+    template <typename T>
+    explicit Cancel(T&& t) : detail::CancelHandle(t)
     {
     }
 };
diff --git a/test/cancel.cpp b/test/cancel.cpp
index d8c75a8..3efefb8 100644
--- a/test/cancel.cpp
+++ b/test/cancel.cpp
@@ -21,11 +21,22 @@
     EXPECT_EQ(c.count, 0);
     {
         Cancel cancel(&c);
+        EXPECT_TRUE(cancel);
+        Cancel cancel2(std::move(cancel));
+        EXPECT_FALSE(cancel);
+        EXPECT_TRUE(cancel2);
         EXPECT_EQ(c.count, 0);
     }
     EXPECT_EQ(c.count, 1);
 }
 
+TEST(CancelTest, EmptyCancel)
+{
+    Cancel cancel, cancel2(std::nullopt);
+    EXPECT_FALSE(cancel);
+    EXPECT_FALSE(cancel2);
+}
+
 TEST(CancelTest, AlwaysCallOnceLambda)
 {
     size_t ctr = 0;