aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--odb/details/transfer-ptr.hxx20
1 files changed, 19 insertions, 1 deletions
diff --git a/odb/details/transfer-ptr.hxx b/odb/details/transfer-ptr.hxx
index 2e40e29..13f113e 100644
--- a/odb/details/transfer-ptr.hxx
+++ b/odb/details/transfer-ptr.hxx
@@ -30,9 +30,27 @@ namespace odb
#ifdef ODB_CXX11_NULLPTR
transfer_ptr (std::nullptr_t): p_ (0) {}
#endif
-
template <typename T1>
transfer_ptr (std::unique_ptr<T1>&& p): p_ (p.release ()) {}
+
+ private:
+ transfer_ptr (const transfer_ptr&);
+ transfer_ptr& operator= (const transfer_ptr&);
+
+ public:
+ transfer_ptr (transfer_ptr&& p): p_ (p.transfer ()) {}
+#else
+ private:
+ transfer_ptr& operator= (const transfer_ptr&);
+
+ public:
+ // In our usage transfer_ptr is always created implicitly and
+ // never const. So while this is not very clean, it is legal.
+ // Plus it will all go away once we drop C++98 (I can hardly
+ // wait).
+ //
+ transfer_ptr (const transfer_ptr& p)
+ : p_ (const_cast<transfer_ptr&> (p).transfer ()) {}
#endif
~transfer_ptr () {delete p_;}