Index: base/memory/ref_counted.h |
diff --git a/base/memory/ref_counted.h b/base/memory/ref_counted.h |
index 219437ed8d82b8b35835a6c3297d5f719f14c277..5f94b4c37ae2eb510176b585b30a9af20e216d32 100644 |
--- a/base/memory/ref_counted.h |
+++ b/base/memory/ref_counted.h |
@@ -14,6 +14,7 @@ |
#ifndef NDEBUG |
#include "base/logging.h" |
#endif |
+#include "base/move.h" |
#include "base/threading/thread_collision_warner.h" |
#include "build/build_config.h" |
@@ -264,6 +265,7 @@ class RefCountedData |
// |
template <class T> |
class scoped_refptr { |
+ TYPE_WITH_MOVE_CONSTRUCTOR_FOR_CPP_03(scoped_refptr) |
public: |
typedef T element_type; |
@@ -286,6 +288,11 @@ class scoped_refptr { |
AddRef(ptr_); |
} |
+ template <typename U> |
+ scoped_refptr(scoped_refptr<U>&& r) : ptr_(r.get()) { |
+ r.ptr_ = nullptr; |
+ } |
+ |
~scoped_refptr() { |
if (ptr_) |
Release(ptr_); |
@@ -323,6 +330,17 @@ class scoped_refptr { |
return *this = r.get(); |
} |
+ scoped_refptr<T>& operator=(scoped_refptr<T>&& r) { |
+ scoped_refptr<T>(r.Pass()).swap(*this); |
+ return *this; |
+ } |
+ |
+ template <typename U> |
+ scoped_refptr<T>& operator=(scoped_refptr<U>&& r) { |
+ scoped_refptr<T>(r.Pass()).swap(*this); |
+ return *this; |
+ } |
+ |
void swap(T** pp) { |
T* p = ptr_; |
ptr_ = *pp; |
@@ -334,6 +352,8 @@ class scoped_refptr { |
} |
private: |
+ template <typename U> friend class scoped_refptr; |
+ |
// Allow scoped_refptr<T> to be used in boolean expressions, but not |
// implicitly convertible to a real bool (which is dangerous). |
// |