forked from boostorg/smart_ptr
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
////
 | 
						|
Copyright 2002, 2003, 2015, 2017, 2019 Peter Dimov
 | 
						|
 | 
						|
Distributed under the Boost Software License, Version 1.0.
 | 
						|
 | 
						|
See accompanying file LICENSE_1_0.txt or copy at
 | 
						|
http://www.boost.org/LICENSE_1_0.txt
 | 
						|
////
 | 
						|
 | 
						|
[#enable_shared_from]
 | 
						|
# enable_shared_from
 | 
						|
:toc:
 | 
						|
:toc-title:
 | 
						|
:idprefix: enable_shared_from_
 | 
						|
 | 
						|
## Description
 | 
						|
 | 
						|
`enable_shared_from` is used as a base class that allows a `shared_ptr` or a
 | 
						|
`weak_ptr` to be obtained given a raw pointer to the object, by using the
 | 
						|
functions `shared_from` and `weak_from`.
 | 
						|
 | 
						|
`enable_shared_from` differs from `enable_shared_from_this<T>` by the fact
 | 
						|
that it's not a template, and is its recommended replacement for new code.
 | 
						|
 | 
						|
## Example
 | 
						|
 | 
						|
```
 | 
						|
#include <boost/smart_ptr/enable_shared_from.hpp>
 | 
						|
#include <boost/shared_ptr.hpp>
 | 
						|
#include <cassert>
 | 
						|
 | 
						|
class Y: public boost::enable_shared_from
 | 
						|
{
 | 
						|
public:
 | 
						|
 | 
						|
    boost::shared_ptr<Y> f()
 | 
						|
    {
 | 
						|
        return boost::shared_from( this );
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
    boost::shared_ptr<Y> p(new Y);
 | 
						|
    boost::shared_ptr<Y> q = p->f();
 | 
						|
    assert(p == q);
 | 
						|
    assert(!(p < q || q < p)); // p and q must share ownership
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
## Synopsis
 | 
						|
 | 
						|
`enable_shared_from` is defined in `<boost/smart_ptr/enable_shared_from.hpp>`.
 | 
						|
 | 
						|
```
 | 
						|
namespace boost {
 | 
						|
 | 
						|
  class enable_shared_from: public enable_shared_from_this<enable_shared_from>
 | 
						|
  {
 | 
						|
  };
 | 
						|
 | 
						|
  template<class T> shared_ptr<T> shared_from( T * p );
 | 
						|
  template<class T> weak_ptr<T> weak_from( T * p ) noexcept;
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
## Functions
 | 
						|
 | 
						|
```
 | 
						|
template<class T> shared_ptr<T> shared_from( T * p );
 | 
						|
```
 | 
						|
[none]
 | 
						|
* {blank}
 | 
						|
+
 | 
						|
Returns:: `shared_ptr<T>( p\->enable_shared_from::shared_from_this(), p )`.
 | 
						|
 | 
						|
NOTE: Throws `bad_weak_ptr` when `p` is not owned by a `shared_ptr`.
 | 
						|
 | 
						|
```
 | 
						|
template<class T> weak_ptr<T> weak_from( T * p ) noexcept;
 | 
						|
```
 | 
						|
[none]
 | 
						|
* {blank}
 | 
						|
+
 | 
						|
Returns:: `weak_ptr<T>( p\->enable_shared_from::weak_from_this(), p )`.
 | 
						|
 | 
						|
NOTE: Unlike `shared_from(this)`, `weak_from(this)` is valid in a destructor
 | 
						|
      and returns a `weak_ptr` that is `expired()` but still shares ownership
 | 
						|
      with other `weak_ptr` instances (if any) that refer to the object.
 |