草庐IT

together_unique

全部标签

c++ - make_unique数组,原始提案与最终提案

StephanTLavavej最初对make_unique的建议是N3588它包括以下功能:make_unique(args...)make_unique_default_init()make_unique(n)make_unique_default_init(n)make_unique_value_init(n,args...)make_unique_auto_size(args...)但是,最后的提案N3656仅包含make_unique(两种形式)。我找不到有关该函数其他形式的任何讨论。我读了theminutesoftheBristolmeeting,但他们甚至都没有引用原始建议

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

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

c++ - 虚拟继承 : Error: no unique final overrider

我知道在问这个问题之前和之前这里已经介绍了虚拟继承,我浏览了虚拟继承的详细信息,并浏览了类似问题的详细信息,如下所示:multiple-diamond-inheritance-compiles-without-virtual-but-doesnt-with和whydoesGCCgivemeanerror-finaloverrider我的问题略有不同,因为我没有使用纯虚函数,而是显式使用虚拟继承来拥有一个唯一的base类。层次结构如下:base/\/\der1der2\/der3我知道关于派生问题的可怕钻石,这就是我使用虚拟继承的原因。#includeclassbase{public:b

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

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

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

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

c++ - 为什么没有 unique_ptr::operator*() 的安全替代方案?

std::vector有成员函数at()作为operator[]的安全替代,因此可以应用边界检查并且没有创建悬空引用:voidfoo(std::vectorconst&x){constauto&a=x[0];//Whatifx.empty()?Undefinedbehavior!constauto&a=x.at(0);//Throwsexceptionifx.empty().}但是,std::unique_ptr缺少相应的功能:voidfoo(std::unique_ptrconst&x){constauto&a=*x;//Whatifbool(x)==false?Undefinedb

c++ - 为了支持 move 语义,函数参数应该由 unique_ptr、value 还是 rvalue 获取?

我的一个函数将vector作为参数并将其存储为成员变量。我正在使用对vector的const引用,如下所述。classTest{public:voidsomeFunction(conststd::vector&items){m_items=items;}private:std::vectorm_items;};但是,有时items包含大量字符串,所以我想添加一个支持move语义的函数(或用新函数替换该函数)。我正在考虑几种方法,但我不确定选择哪一种。1)unique_ptrvoidsomeFunction(std::unique_ptr>items){//Also,make`m_itm

c++ - std::unique_ptr vs std::shared_ptr vs std::weak_ptr vs std::auto_ptr vs 原始指针

与使用原始指针的类似(但不限于)一些高级技术相比,每个智能指针的等效用途是什么?我的理解很少,但从我能收集到的情况来看:原始指针:只有在你真的、真的、真的、真的知道你在做什么并且在界面后面小心地隐藏了用法的情况下才使用。std::auto_ptr:已过时永不使用。std::unique_ptr:在分配时转移所有权的单例指针。std::shared_ptr:引用计数指针,在分配时不会转移所有权,但会增加其引用计数。当所有引用离开作用域或显式std::shared_ptr::reset标的deallocator被调用。std::weak_ptr:子类型std::shared_ptr它不会增

c++ - 为什么 std::unique_lock 使用类型标签来区分构造函数?

在C++11中,std::unique_lockconstructor被重载以接受类型标签defer_lock_t、try_to_lock_t和adopt_lock_t:unique_lock(mutex_type&m,std::defer_lock_tt);unique_lock(mutex_type&m,std::try_to_lock_tt);unique_lock(mutex_type&m,std::adopt_lock_tt);这些是空类(类型标签)definedasfollows:structdefer_lock_t{};structtry_to_lock_t{};stru

c++ - 为什么我不能在 C++14 的 lambda 中 move std::unique_ptr?

我想在lambda中传递一个原始指针,但如果未调用lambda,我不希望它被泄露。它看起来像这样:voidClean(std::unique_ptr&&list);voidf(int*list){thread_pool.Push([list=std::unique_ptr(list)]{Clean(std::move(list));//我在Clang3.7.0中遇到错误:error:bindingofreferencetotype'unique_ptr'toavalueoftype'unique_ptr'dropsqualifiers但我一开始没有看到任何限定词,尤其是被丢弃了。另外,