pinned: Fix CTAD

This makes it much easier to utilize as we don't need to fully specify
types.

Change-Id: I73552a11782f6762a68a9f675ed380feea37326b
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/include/stdplus/pinned.hpp b/include/stdplus/pinned.hpp
index 085ea8d..abf6c7f 100644
--- a/include/stdplus/pinned.hpp
+++ b/include/stdplus/pinned.hpp
@@ -63,6 +63,9 @@
 };
 
 template <typename T>
+Pinned(T t) -> Pinned<std::remove_cvref_t<T>>;
+
+template <typename T>
 struct PinnedRef : std::reference_wrapper<T>
 {
     using type = T;
@@ -99,6 +102,21 @@
     }
 };
 
+template <typename T>
+PinnedRef(T t) -> PinnedRef<std::remove_reference_t<T>>;
+
+template <typename T>
+PinnedRef(Pinned<T>& t) -> PinnedRef<T>;
+
+template <typename T>
+PinnedRef(const Pinned<T>& t) -> PinnedRef<const T>;
+
+template <typename T, typename Deleter>
+PinnedRef(const std::unique_ptr<T, Deleter>& t) -> PinnedRef<T>;
+
+template <typename T>
+PinnedRef(const std::shared_ptr<T>& t) -> PinnedRef<T>;
+
 } // namespace stdplus
 
 template <class T>
diff --git a/test/pinned.cpp b/test/pinned.cpp
index c8daa3c..a46d949 100644
--- a/test/pinned.cpp
+++ b/test/pinned.cpp
@@ -12,10 +12,10 @@
 TEST(Pinned, Basic)
 {
     EXPECT_EQ("hi", Pinned<std::string>("hi"));
-    EXPECT_EQ("hi", Pinned<std::string>(std::string("hi")));
+    EXPECT_EQ("hi", Pinned(std::string("hi")));
     auto s = std::string("hi");
-    EXPECT_EQ("hi", Pinned<std::string>(s));
-    EXPECT_EQ("hi", Pinned<std::string>(std::move(s)));
+    EXPECT_EQ("hi", Pinned(s));
+    EXPECT_EQ("hi", Pinned(std::move(s)));
     Pinned<std::string> ps = "hi";
     EXPECT_EQ("hi", Pinned<std::string>(ps));
     // EXPECT_EQ("hi", Pinned<std::string>(std::move(ps)));
@@ -37,7 +37,7 @@
 
 TEST(Pinned, Fundamental)
 {
-    Pinned<int> pi = 4;
+    Pinned pi = 4;
     EXPECT_EQ(4, [](int& f) { return f; }(pi));
     EXPECT_EQ(4, [](int f) { return f; }(pi));
 }
@@ -66,7 +66,7 @@
 TEST(PinnedRef, Basic)
 {
     auto uptr = std::make_unique<std::string>("hi");
-    PinnedRef<std::string>(uptr).get()[0] = 'd';
+    PinnedRef(uptr).get()[0] = 'd';
     EXPECT_EQ("di", *uptr);
     PinnedRef<const std::string> cref(uptr);
     // cref.get()[0] = 'e';
@@ -81,6 +81,7 @@
     const Pinned<std::string> cpstr("hi");
     // EXPECT_EQ("hi", PinnedRef<std::string>(cpstr).get());
     EXPECT_EQ("hi", PinnedRef<const std::string>(cpstr).get());
+    EXPECT_EQ("hi", PinnedRef(cpstr).get());
 }
 
 TEST(PinnedRef, Fundamental)
@@ -102,6 +103,7 @@
     // PinnedRef<NoMove2> rnm2(nm2);
     NoMove3 nm3;
     PinnedRef<NoMove3> rnm3(nm3);
+    PinnedRef rnm3i(nm3);
 }
 
 } // namespace stdplus