c++新特性11 (10)shared_ptr六”构造函数unique_ptr参数“
1. 构造函数
shared_ptr p(u)
p从unique_ptr u中接管了对象的所有权;将u置为空
template <class _Ux, class _Dx,enable_if_t<conjunction_v<_SP_pointer_compatible<_Ux, _Ty>,is_convertible<typename unique_ptr<_Ux, _Dx>::pointer, element_type*>>,int> = 0>shared_ptr(unique_ptr<_Ux, _Dx>&& _Other) {using _Fancy_t = typename unique_ptr<_Ux, _Dx>::pointer;using _Raw_t = typename unique_ptr<_Ux, _Dx>::element_type*;using _Deleter_t = conditional_t<is_reference_v<_Dx>, decltype(_STD ref(_Other.get_deleter())), _Dx>;const _Fancy_t _Fancy = _Other.get();if (_Fancy) {const _Raw_t _Raw = _Fancy;const auto _Rx = new _Ref_count_resource<_Fancy_t, _Deleter_t>(_Fancy, _Other.get_deleter());_Set_ptr_rep_and_enable_shared(_Raw, _Rx);_Other.release();//将u置为空}}
1.1 _Ref_count_resource
// CLASS TEMPLATE _Ref_count_resource
template <class _Resource, class _Dx>
class _Ref_count_resource : public _Ref_count_base { // handle reference counting for object with deleter
public:_Ref_count_resource(_Resource _Px, _Dx _Dt): _Ref_count_base(), _Mypair(_One_then_variadic_args_t{}, _STD move(_Dt), _Px) {}#ifdef __EDG__ // TRANSITION, VSO-1292293virtual ~_Ref_count_resource() noexcept override {} // TRANSITION, should be non-virtual
#else // ^^^ workaround / no workaround vvvvirtual ~_Ref_count_resource() noexcept override = default; // TRANSITION, should be non-virtual
#endif // ^^^ no workaround ^^^virtual void* _Get_deleter(const type_info& _Typeid) const noexcept override {#if _HAS_STATIC_RTTIif (_Typeid == typeid(_Dx)) {return const_cast<_Dx*>(_STD addressof(_Mypair._Get_first()));}
#else // _HAS_STATIC_RTTI(void) _Typeid;
#endif // _HAS_STATIC_RTTIreturn nullptr;}private:virtual void _Destroy() noexcept override { // destroy managed resource_Mypair._Get_first()(_Mypair._Myval2);}virtual void _Delete_this() noexcept override { // destroy selfdelete this;}_Compressed_pair<_Dx, _Resource> _Mypair;
};
c++新特性11 (10)shared_ptr六”构造函数unique_ptr参数“相关推荐
- c++新特性11 (10)shared_ptr七reset
1. 使用场景 p.reset() 若p是唯一指向其对象的shared_ptr,reset会释放此对象. p.reset(q) 释放原有对象的同时,若传递了可选的内置参数指针q,会令p指向q,否则会将 ...
- c++新特性11 (10)shared_ptr一”概述“
- python 3.0 print_Python 3.x 新特性及10大变化
python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3 Python之父Guido van Rossum谈到了Python 3.0的构思: 一直以来,除非要打破向后兼容性, ...
- c++新特性11 (12)weak_ptr类定义
1. 类定义 // CLASS TEMPLATE weak_ptr template <class _Ty> class weak_ptr : public _Ptr_base<_T ...
- c++新特性11 (6) =default
1. 使用=default来要求编译器生成一个默认构造函数 struct Point{ Point() = default;//不用像下面的构造函数一样要一一对成员变量赋值Point(int _x, ...
- c++新特性11 (11)unique_ptr
有一个_Compressed_pair成员,类似于pair<key,value>队 // CLASS TEMPLATE unique_ptr SCALAR template <cla ...
- c++新特性11 (9)智能指针一”_Compressed_pair类“
功能类似std::pair类,但是是派生关系, key 类有一个value对象 template <class _Ty1, class _Ty2, bool = is_empty_v<_T ...
- MySQL8.0 - 新特性 - 说说InnoDB Log System的隐藏参数
InnoDB在设计lock-free的log system时,除了已有的参数外,还通过宏控制隐藏了一些参数,如果你使用源码编译时,打开cmake选项-DENABLE_EXPERIMENT_SYSVAR ...
- JavaScript6、7、8、9、10、11新特性
目录 1.ECMAScript6新特性 1.1.let 关键字 1.1.1.不允许重复声明 1.1.2.块级作用域 1.1.3.不存在变量提升 1.1.4.不影响作用域链 1.2.const 关键字 ...
最新文章
- Ubuntu 修改时区和时间
- python 检测四边形,并矫正
- 网络公司千千万,放心委托看这里!
- java基础语法学习
- 项目管理基础:系统切换相关知识笔记
- 【Python3网络爬虫开发实战】 1.7.1-Charles的安装
- Asp.Net 4.0 新特性 系列 之一 从页面标记%%说起
- NGUI的输入框制作(attach- input filed script的使用)
- Cisco防火墙概述和产品线
- MatConvNet训练自己的网络
- 虚拟交换系统-VSS
- 计算机无法找到输出设备,电脑没声音找不到输出设备怎么办
- 【jqxGrid】jqwidgets.createInstance()方法报错的一种解决方法
- win8 报file://CBD 0xc0000034 蓝屏
- win10 win11关睿频(打开隐藏的“处理器性能提升模式”)
- JS ListBox动态加载数据
- 编写一个求x的n次方的函数
- 3GPP TS 29244-g30 中英文对照 | 5.4.14 Deferred PDR activation and deactivation
- OriginPro绘图过程中遇到的问题及解决办法
- webpack-dev-server filename中的路径问题,IntelliJ IDEA local history有效期设置,标签顺序设置,dva call put 解构
热门文章
- websocket导致spring boot 项目单元测试启动失败的问题解决
- 【Python】青少年蓝桥杯_每日一题_3.05_排列组合
- mongodb 服务器时区设置_关于MongoDB-Balancer设置时间窗口的问题
- grafana导入json文件没有数据_XAMPP客户端环境无法导入较大Mysql数据库文件的解决方法...
- 数据中心架构有哪些组件?
- 如何面对边缘计算10个痛点?
- 大数据时代数据中心的发展思考
- Algorithm:数学建模大赛(国赛和美赛)的简介/内容、数学建模做题流程、历年题目类型及思想、常用算法、常用工具之详细攻略
- 成功解决xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b‘Debug is
- 成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'express'