当我查看Container它列出了对cppreference的要求Destructible作为value_type的要求。这似乎暗示容器元素的析构函数可能不会抛出。我无法在C++14标准中找到对这一要求的引用(没有查看旧版本)。我唯一能找到的是value_type必须是Erasable这根本不意味着任何异常安全。所以我的问题是,std::vector中的元素可以有抛出析构函数吗?如果不是,标准中的哪个部分禁止它?P.S.:别担心,我不打算创建带有抛出析构函数的类型。我只是在编写一个符合标准的实现,并试图获得正确的异常安全性。 最佳答案
我想知道在这样的类(class)中会发生什么:classMyClass{private:std::vectoriVector;voidWorker(){//LotsofstuffdonewithiVector//adding,removingelements,etc.}}假设我创建了一个使用iVector并修改它的线程(由类成员函数之一调用)。除了这个worker之外,该类的其他成员函数都没有读取或修改这个std::vector。一切似乎都很好,因为工作线程是唯一使用iVector的线程。但是当对象的一个实例被销毁时会发生什么?即使对象在工作线程完成后被销毁,iVector的析构函
classObject{public:...virtual~Object()=0;...};Object::~Object(){}//Shouldwealwaysdefinethepurevirtualdestructoroutside?问题:我们是否应该始终在类定义之外定义纯虚析构函数?换句话说,这就是我们不应该定义任何内联虚函数的原因?谢谢 最佳答案 您可以内联定义虚函数。您不能内联定义纯虚拟函数。根本不允许以下语法变体:virtual~Foo()=0{}virtual~Foo(){}=0;但这是完全有效的:virtual~Fo
我认为基类中的构造函数和析构函数不能被基类的派生类继承。我的理解对吗? 最佳答案 你的理解是正确的。例如,如果您有classBase{Base(inti){}};classDerived:publicBase{};Derivedd(3);这不会编译,因为Base构造函数不是继承的。请注意,如果可能,默认构造函数和复制构造函数由编译器创建,并调用基类的相应构造函数,因此对于这些构造函数,看起来好像它们是继承的。 关于c++-构造函数和析构函数继承,我们在StackOverflow上找到一个
我需要建立一个类继承结构,其中抽象基类只包含成员变量(但没有成员方法)。成员方法将由派生类定义。因此,我需要的是这篇文章:Makingaclassabstractwithoutanypurevirtualmethods从前2个答案中,我意识到有两种方法可以实现它:使析构函数成为纯虚拟的。使构造函数受到保护。我很想知道这两种方法之间的区别。是否存在一种情况应该优先于另一种情况(或者可能是某些特殊情况,其中一种可以工作但另一种不行)?我想了想,也想不出什么。我在这里搜索了一些帖子的答案(Isthereauseformakingaprotecteddestructorvirtual?、C++
我的代码中出现链接器错误。我已将其精确定位为以下最基本的要点。这段代码给出了链接器错误"vtableforFoo",referencedfrom:Foo::Foo()classFoo{public:Foo();virtual~Foo()=default;};Foo::Foo(){}但是这段代码没有给出任何错误:classFoo{public:Foo();virtual~Foo(){}};Foo::Foo(){}为什么?我认为=default基本上应该和那些空方括号做同样的事情。更新:我正在使用“AppleLLVM编译器4.1”,它是Xcode4.5.2的一部分。这可能是这个编译器中的错
在C++11中,我的理解是默认情况下析构函数是隐式的noexcept(true),除了:如果我有一个类C有一个显式标记为noexcept(false)的析构函数(大概是因为它出于某种奇怪的原因抛出,我知道你不应该,为什么)然后是派生自C的任何类的析构函数或包含C类型的成员也变成noexcept(false).但是,一个包含std::shared_ptr的类显然不会自动将其析构函数切换为noexcept(false),包含std::weak_ptr也是如此,std::unique_ptr等这是一个完整的例子:#include#includestructNormal{~Normal(){}
考虑以下C++11代码:#include#includestructA{A(){}//virtual~A()=default;//~A()=default;//~A(){};std::threadt;};intmain(){std::vectorv;v.emplace_back();}如果前面代码中声明析构函数的任何行未被注释,则此代码将无法编译。编译器提示std::thread的复制构造函数被删除。但是std::vector::emplace_back不应该使用复制构造函数,那么,为什么会失败呢?为什么提到析构函数很重要?GCC输出(~A(){};未注释):$g++--std=c++
我在某处读到,自C++11起,析构函数被隐式声明为noexcept(true)。来自标准第12.4节Adeclarationofadestructorthatdoesnothaveanexception-specificationhasthesameexceptionspecificationasifhadbeenimplicitlydeclared但是在标准中的任何地方我都找不到一个部分说析构函数是隐式的noexcept(true)。谁能指出我可以找到此信息的部分? 最佳答案 我相信您正在寻找§15.4/14(强调我的):Anin
我正在尝试为共享指针析构函数找出最宽松(和正确)的内存顺序。目前我的想法如下:~shared_ptr(){if(p){if(p->cnt.fetch_sub(1,std::memory_order_release)==1){p->cnt.load(std::memory_order_acquire);deletep;}}}基本上,我认为所有以前的fetch_sub()应该发生在deletep;之前,并且由p->cnt.load(std::memory_order_acquire);,我构建了一个释放序列来确保这一点。我是C++内存模型的新手,不太自信。我上面的推理是否正确,我指定的内存