vim 多行合并一行 | 您所在的位置:网站首页 › 多行合并成一行内容不变快捷键怎么设置 › vim 多行合并一行 |
make_shared理解
CodesFox: 再补充一下,为什么使用make_shared时,明明make_shared创建shared_ptr对象也会产生一次指针引用,最终整个语句过程却一共只产生了一次指针引用:因为make_shared是函数,函数返回值被归为右值,因此此时shared_ptr将调用移动构造函数(或移动赋值函数),直接从make_shared的返回对象将所有东西“夺取”成为自己的东西,而不是从返回对象“复制”到自身,也就不会再产生一次新的指针引用了,自始至终就只有make_shared在创建shared_ptr对象时产生了一次新的指针引用。 make_shared理解CodesFox: 这里补充解释一下return shared_ptr(_Sp_make_shared_tag(), __a, std::forward(__args)...);这里,明明__args定义时是_Args&&模版类型,具有引用折叠的机制,还要“多此一举”地使用std::forward()转发: std::forward()主要是为了应对这样的情况: 例如__args中有一个参数项解析得到是&&右值引用类型,这里姑且叫做arg,这个时候如果直接将这个arg作为参数传给shared_ptr的构造函数时会产生报错的,因为arg类型上是&&右值引用,因此很自然的应该调用对应位置接受右值传参的函数重载,但就是此时会发生错误:函数拒绝接受参数arg,因为它虽然类型是&&右值引用,但它的属性是“左值”,而&&传参只接受右值属性。 到这里就容易让人困惑了,arg明明已经是&&右值引用类型了,属性上是左值又是什么鬼?——其实也不难理解,从过程上看,arg实际上是被赋值的,相当于它就是在“=”左边,那它就是左值,没毛病对吧? 所以这个时候怎么办呢?类型已经是&&右值引用了,却因为属性是左值而没办法作为右值传参,这不废了?这个时候就是std::forward()派上用场的时候了,这个函数的存在意义,可以理解为:对类型为&&右值引用的变量,将其属性同步为右值属性以满足传参的需要,这个时候share_ptr构造函数的对应重载就能顺利接受arg这个右值引用参数了,这也就是所谓的“转发”机制了。 make_shared理解
ada0_ada1:
话说如果要看stl源码需要先看啥会比较好理解这些源码
H丶十一:
这么高的访问量这么简短的回复以为是扯淡,原来小丑是我自己 奈斯兔咪呦: 我也总是登陆失败 什么原因啊 |
CopyRight 2018-2019 实验室设备网 版权所有 |