草庐IT

c++ - 指向 std::unique_ptr 的内容

我有一个std::unique_ptr和另一个原始指针。我希望原始指针指向没有任何所有权的unique_ptr的内容。是只读关系:autobar=std::make_unique();autoptr=bar.get();//Thismaypointtoanothervaluelater这很糟糕吗?有没有其他选择?注意:真实的例子更复杂。他们不在同一个类(class)。 最佳答案 不,还不错,直到标准库包含proposedstd::observer_ptr,这是表达无主观察者的惯用方式。

c++ - shared_ptr 交换线程安全吗?

这里有一些代码片段。std::shared_ptrglobal(newint(1));voidswapper(intx){std::shared_ptrsp(newint(x));global.swap(sp);}假设我想在并行线程中调用swapper。那会是线程安全的吗?我知道answer.它显示了如果我将值重新分配给global,那么分配指针是不是线程安全的。我的问题是swap成员函数本身是否是线程安全的。一方面,shared_ptr的控制block函数是线程安全的。另一方面,我假设我正在交换指向控制block的指针,所以它不应该是线程安全的。那里有什么联系?swap线程安全吗?

C++ 错误 - "member initializer expression list treated as compound expression"

我遇到了一个我不熟悉的C++编译器错误。可能是一个非常愚蠢的错误,但我不能完全指出它。错误:test.cpp:27:error:memberinitializerexpressionlisttreatedascompoundexpressiontest.cpp:27:warning:left-handoperandofcommahasnoeffecttest.cpp:27:error:invalidinitializationofreferenceoftype‘constBar&’fromexpressionoftype‘int’代码:1#include23classFoo{4publ

c++ - std::auto_ptr 或 boost::shared_ptr 用于 pImpl 成语?

使用pImplidiom时是否最好使用boost:shared_ptr而不是std::auto_ptr?我确定我曾经读过boost版本对异常更友好?classFoo{public:Foo();private:structimpl;std::auto_ptrimpl_;};classFoo{public:Foo();private:structimpl;boost::shared_ptrimpl_;};[编辑]使用std::auto_ptr是否总是安全的,或者是否存在需要替代boost智能指针的情况? 最佳答案 您不应该为此使用std

c++ - 为什么 as_const 禁止右值参数?

我想问为什么as_const禁止右值参数,accordingtocppreference.com(即为什么标准人员这样做,而不是为什么cppreference.com专门引用它们。而且也不是在哪里规范委员会的意图是编纂的,只是为了确保:)))。这个(人工)示例会产生错误(用户希望将其设为const以保持COW安静)QCharc=as_const(getQString())[0];Anotherquestion'sanswer指出,如果我们只是删除右值引用重载的删除,它会默默地将右值转换为左值。对,但为什么不优雅地处理右值,为右值输入返回constrvalues,为左值输入返回const

c++ - 将 const std::unique_ptr 用于 pimpl 习惯用法

在HerbSutter'stalkatCppCon16他建议用conststd::unique_ptr编写pimplidiom(大约10分钟)。这应该如何与移动构造函数/赋值一起使用?c++17中有什么东西吗?我找不到任何东西。 最佳答案 如果您的类应该是永不为空的,那么非常量的唯一ptr(具有默认移动/分配)是不合适的。movector和moveassign都会清空rhs。一个constuniqueptr将禁用这些自动方法,如果你想移动,你必须在impl中编写它(并在外面有点胶水)。我会亲自编写一个具有我想要的语义的值ptr(然后

c++ - 为什么 auto_ptr 不支持 op->*()

auto_ptr(以及shared_ptr)尽量使它们的使用透明;也就是说,理想情况下,您应该无法区分您使用的是auto_ptr还是指向对象的真实指针。考虑:classMyClass{public:voidfoo(){}};MyClass*p=newMyClass;auto_ptrap(newMyClassp);p->foo();//Nonotationaldifferenceinusingrealap->foo();//pointersandauto_ptrs当你尝试通过一个指向成员的指针来调用一个成员函数时,这是有区别的,因为auto_ptr显然没有实现op->*():void(M

c++ - 绑定(bind)到一个weak_ptr

有没有办法std::bind到std::weak_ptr?我想存储一个“弱函数”回调,当被调用者被销毁时会自动“断开”。我知道如何使用shared_ptr创建std::function:std::functionMyClass::GetCallback(){returnstd::function(std::bind(&MyClass::CallbackFunc,shared_from_this()));}然而,返回的std::function让我的对象永远活着。所以我想将它绑定(bind)到weak_ptr:std::functionMyClass::GetCallback(){std

c++ - 关于 shared_ptr 用法的问题 - C++

我对使用shared_ptr的最佳实践有几个问题。问题1复制shared_ptr便宜吗?还是我需要将它作为对我自己的辅助函数的引用并作为值返回?类似的,voidinit_fields(boost::shared_ptr&/*p_foo*/);voidinit_other_fields(boost::shared_ptr&/*p_foo*/);boost::shared_ptrcreate_foo(){boost::shared_ptrp_foo(newfoo);init_fields(p_foo);init_other_fields(p_foo);}问题2我应该使用boost::mak

c++ - 带有派生类的 std::unique_ptr

我对c++11指针有疑问。具体来说,如何将基类的唯一指针转为派生类?classBase{public:intfoo;}classDerived:publicBase{public:intbar;}...std::unique_ptrbasePointer(newDerived);//now,howdoIaccessthebarmember?这应该是可能的,但我不知道怎么做。每次我尝试使用basePointer.get()我最终导致可执行文件崩溃。提前致谢,如有任何建议,我们将不胜感激。 最佳答案 如果它们是多态类型并且您只需要一个指