假设我有一个名为foo的类它继承自一个名为bar的类.我有一个std::unique_ptr到foo的实例我想将它传递给一个只接受std::unique_ptr的函数.我怎样才能转换指针以便它在我的函数中工作? 最佳答案 您可以转换std::unique_ptr右值std::unique_ptr:std::unique_ptrf(newfoo);std::unique_ptrb(std::move(f));显然,指针将由b拥有如果b被摧毁bar需要有一个virtual析构函数。 关于c+
从C++中的GCC6开始,unique_ptr::reset的声明/定义方法(不是那个,只接受nullptr_t)看起来像这样:template,__and_,is_pointer,is_convertible::type(*)[],element_type(*)[]>>>>>voidreset(_Up__p)noexcept{usingstd::swap;swap(std::get(_M_t),__p);if(__p!=nullptr)get_deleter()(__p);}这在某些时候已更改以实现N4089.根据该文件:Thisfunctionbehavesthesameasthe
所以我有一个简单的cow_ptr.它看起来像这样:template>structcow_ptr:privateBase{usingBase::operator*;usingBase::operator->;usingBase::operatorbool;//etccow_ptr(std::shared_ptrptr):Base(ptr){}//defaultedspecialmemberfunctionstemplatedecltype(auto)write(F&&f){if(!unique())self_clone();Assert(unique());returnstd::forw
Mr.LidströmandIhadanargument:)先生。Lidström的声明是一个构造shared_ptrp(newDerived);不要求Base具有虚拟析构函数:ArmenTsirunyan:"Really?Willtheshared_ptrcleanupcorrectly?Couldyoupleaseinthiscasedemonstratehowthateffectcouldbeimplemented?"DanielLidström:"Theshared_ptrusesitsowndestructortodeletetheConcreteinstance.Thisi
有一组关于交叉转换的问题(从T1*转换为不相关的T2*),例如this和this.答案通常是这样的:reinterpret_cast是实现定义的,转换为void*后跟static_cast是明确定义的。然而,我还没有看到使用reinterpret_cast时可能出错的任何真实示例。通过void*进行强制转换而reinterpret_cast无效的真实示例有哪些? 最佳答案 real-lifeexampleswherecastingthroughvoid*worksandreinterpret_castdoesn't如果我将这句话解释
如果我有一个boost::shared_array(或boost::shared_ptr),有没有办法获得boost::shared_ptr哪个与数组共享?例如,我可能想写:shared_arrayarray(newint[10]);shared_ptrelement=&array[2];我知道我不能使用&array[2],因为它只有类型int*,这对shared_ptr是危险的有一个将采用该类型的隐式构造函数。理想shared_array上面会有一个实例方法,比如:shared_ptrelement=array.shared_ptr_to(2);很遗憾,我找不到这样的东西。share
在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void。我见过两种方法;转换为无效:(void)(expr)//orstatic_cast(expr)或者,或者,使用带有voidprvalueRHS的逗号运算符:(expr),void()据我了解,在这两种情况下,expr都会被求值(为了格式良好,在非求值上下文中)并丢弃结果(或结果类型,在非求值上下文中);在任何一种情况下,即使是病态类T也无法覆盖T::operatorvoid()或operator,(T,void)。(参见:Whyis"operatorvoid"notinvokedwithcastsyntax?、Wha
我有一个使用Bar类的Foo类。Bar仅在Foo中使用,而Foo正在管理Bar,因此我使用unique_ptr(不是引用,因为我不需要Foo之外的Bar):usingnamespacestd;structIBar{virtual~IBar()=default;virtualvoidDoSth()=0;};structBar:publicIBar{voidDoSth()override{coutbar):bar_(std::move(bar)){}voidDoIt(){bar_->DoSth();}private:unique_ptrbar_;};目前一切顺利,一切正常。但是,当我想对代
如你所见here,shared_ptr作为指针而不是引用传递。还要注意Allthesefunctionsinvokeundefinedbehaviorifpisanullpointer.那么为什么是指针呢?我认为在C++中,应该优先使用引用,除非有特定的原因需要使用指针。 最佳答案 templateboolatomic_is_lock_free(conststd::shared_ptr*p);接受一个指向智能指针的指针,因为这是更通用的atomic_is_lock_free的特例:templateboolatomic_is_lock
我有一个函数,我希望在90%的时间内完成清理操作,但在10%的时间内我希望完成一些其他操作。有什么方法可以使用一些标准范围的控件,例如shared_ptr这样一开始它可以有一个删除操作,然后在函数中可以更改删除操作?shared_ptrptr(newT,std::mem_fun_ref(&T::deleteMe));ptr.pn.d=std::mem_fun_ref(&T::queueMe); 最佳答案 不是真的-shared_ptr的标准以这样的方式编写Deleter可以按值存储在控制节点(一个包含引用计数器、保存删除器、跟踪弱指