我的类有一个operator[],它所做的就是在unique_ptr上调用std::unique_ptr::operator[]>成员(member)。相关部分就是这样:templatestructFoo{T&operator[](constsize_tpos)constnoexcept{returndata_[pos];}std::unique_ptrdata_;};我已将运算符标记为noexcept。但是,unique_ptr::operator[]不是noexcept。我无法找出原因,也不知道我是否可以假设它永远不会抛出。unique_ptr::operator[]本身没有在文档
为什么C++标准包含atomic_store或atomic_load重载shared_ptr而不是weak_ptr?这只是一个疏忽,还是有没有为weak_ptr提供原子操作的实际原因? 最佳答案 这似乎是一个疏忽。HerbSutter为atomic_shared_ptr/atomic_unique_ptr/atomic_weak_ptr提出了一个C++(17?)标准设计提案,该文档还解释了现有方法的缺点,其中包含用于shared_ptr的免费函数atomic_load/atomic_store:http://www.open-std
我将要设计一个API,其中存在两个类:数据/计算类和此类的容器。然而,容器不仅仅是一个哑容器,它还携带有关整个集合的信息,这超出了可以用迭代器实现的常见内容。所以,容器基本上包装了一个std::vector,添加一些预先计算的属性,实用函数等。容器类的API还应该包含的是添加data/calc类实例的方法,访问方法。我不只是想打开std::vector对公众来说,因为向容器中添加新的data/calc类会导致重新计算集合类的许多属性。但是,我想提供与STL容器访问器方法相同的访问器方法at()和operator[].最初,我添加了一个std::vector>类型的私有(private)
这articleJeffPreshing指出双重检查锁定模式(DCLP)在C++11中得到修复。用于此模式的经典示例是单例模式,但我碰巧有一个不同的用例,而且我仍然缺乏处理“原子武器”的经验-也许这里有人可以帮助我。Jeff在"UsingC++11SequentiallyConsistentAtomics"下描述的以下代码是否是正确的DCLP实现??classFoo{std::shared_ptrdata;std::mutexmutex;voiddetach(){if(data.use_count()>1){std::lock_guardlock{mutex};if(data.use_
我有一个vector:std::vector>并想插入几个新的unique_ptr在指定位置放入其中。有成员函数std::vector::insert(iteratorposition,size_typen,constvalue_type&val)但唉,复制的限制unique_ptr的不允许使用此重载。我已阅读thisquestion,然而这是为了插入unique_ptr已经存在于另一个vector中。我想创建新的。我意识到我可以用一个循环来做到这一点,例如将3个新项目插入vector的开头:for(intn=0;n!=3;++n)vec.insert(vec.begin(),std:
是否有任何静态分析工具可以帮助检测shared_ptr循环引用?即使这样的工具不能检测复杂的情况,它对于消除简单的情况仍然有用。 最佳答案 不知道是否存在此类工具,但是hereare关于这个问题的好想法:Thekeytoeffectiveobjectlifetimemanagementistohaveanacyclicobjectownershipgraph.Thenyouusesharedpointerswhengoingdown,weakpointerswhengoingsideways,andweakpointers(orso
我目前正在做一个大项目,我需要使用weak_ptr而不是shared_ptr.这是我的问题。我有一个名为House的类,其属性为:vector>my_people.我想修改这个数据成员为vector>my_people.我的setter/getter是vector>&getPeople()const{returnmy_people;}通常,使用简单的weak_ptr我可以回my_people.lock();但是我有一个vector,但我不知道如何做这样的事情:vector>&getPeople()const{for(vector::iteratorit=my_people.begin(
现在我正在重写部分代码以使用C++11标准。在某些地方我发现了以下代码:boost::shared_arrayarray;是否可以将其替换为:std::shared_ptr>array;我正在尝试在我的代码中替换C++11中已经存在的所有boost功能。我需要澄清一点。实际上我需要一个原始数组(但有引用计数,所以它可以自动删除),不需要所有那些vector特征。所以boost::shared_array解决了我想要的问题,没有任何额外的成本。但我试图让我的代码尽可能多地使用新标准(尽管新标准仍未涵盖来自boost的许多库)。谢谢。 最佳答案
我有一个重载下标运算符的类:classSomeClass{public:int&operator[](constintidx){returnsomeArray[idx];}private:intsomeArray[10];};这当然允许我像这样访问someArray成员的数组元素:SomeClassc;intx=c[0];然而,一些SomeClass的实例将被包裹在一个boost共享指针中:boost::shared_ptrp(newSomeClass);但是,为了使用下标运算符,我必须使用更冗长的语法,这种语法破坏了下标运算符重载的简洁性:intx=p->operator[](0);
在下面的例子中,怎么可能正确调用了~CImpl,但是当需要移动类时,编译器却说它有一个不完整的类型?如果将Impl的声明移动到header,它会起作用,我的问题是为什么析构函数被调用得很好,所以看起来类型不完整,但移动时出现问题。文件:C.hpp#includeclassImpl;classC{public:C();~C();C(C&&)=default;C&operator=(C&&)=default;std::unique_ptrp;};文件C.cpp#include"C.hpp"#includeusingnamespacestd;classImpl{public:Impl(){}