C++0x,std::move和std::forward解析(二)
t_deleter.
? ? ? void* __p = _M_refcount._M_get_deleter(typeid(__tag));
? ? ? _M_ptr = static_cast<_Tp*>(__p);
? ? ? __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
? ? }
#else
? ? ? template
? ? ? ? struct _Deleter
? ? ? ? {
? ? ? ? ? void operator()(_Tp* __ptr)
? ? ? ? ? {
? ? ? ? typedef allocator_traits<_Alloc> _Alloc_traits;
? ? ? ? _Alloc_traits::destroy(_M_alloc, __ptr);
? ? ? ? _Alloc_traits::deallocate(_M_alloc, __ptr, 1);
? ? ? ? ? }
? ? ? ? ? _Alloc _M_alloc;
? ? ? ? };
?
? ? ? template
? ? __shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a,
? ? ? ? ? ? ?_Args&&... __args)
? ? : _M_ptr(), _M_refcount()
? ? ? ? {
? ? ? typedef typename _Alloc::template rebind<_Tp>::other _Alloc2;
? ? ? ? ? _Deleter<_Alloc2> __del = { _Alloc2(__a) };
? ? ? typedef allocator_traits<_Alloc2> __traits;
? ? ? ? ? _M_ptr = __traits::allocate(__del._M_alloc, 1);
? ? ? ? {
? ? ? ? ? // _GLIBCXX_RESOLVE_LIB_DEFECTS
? ? ? ? ? // 2070. allocate_shared should use allocator_traits::construct
? ? ? ? ? __traits::construct(__del._M_alloc, _M_ptr,
? ? ? ? ? ? ? ? ? ? ? ? ? std::forward<_Args>(__args)...);
? ? ? ? }
? ? ? __catch(...)
? ? ? ? {
? ? ? ? ? __traits::deallocate(__del._M_alloc, _M_ptr, 1);
? ? ? ? ? __throw_exception_again;
? ? ? ? }
? ? ? ? ? __shared_count<_Lp> __count(_M_ptr, __del, __del._M_alloc);
? ? ? ? ? _M_refcount._M_swap(__count);
? ? ? __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
? ? ? ? }
#endif
复制代码
?
?
//new_allocator.h
#if __cplusplus >= 201103L
? ? ? template
? ? ? ? void
? ? ? ? construct(_Up* __p, _Args&&... __args)
? ? { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
上面STL例子,还应用了可变参数模版和转发参数包语法,需要进一步了解。本人水平有限,如果错误请指正谢谢。