以下似乎可以在我试过的几个编译器上编译:classA{public:virtualvoidfoo()throw()=0;};classB:publicA{public:virtualvoidfoo()noexceptoverride{}};似乎可以用较新的noexcept规范覆盖throw()函数。我也尝试了相反的方法(用throw()覆盖noexcept),它似乎有效。这是为什么?这是未定义的行为还是允许的?请注意,代码生成受noexcept与throw()的影响。它们也没有等效的行为,因为noexcept调用的终止函数与throw()不同。一个理想的答案是指出行为差异以及它们在这种
假设C++编译器正在编译一个函数,该函数的定义在与其调用相同的翻译单元中可用。假设它既不抛出自身也不调用已知抛出的函数。还假设没有调用externC代码,也没有调用具有潜在零值的数字除法。在这些假设下,编译器会将函数视为noexcept吗?如果不是,是否还有其他条件可以推断出noexcept?具体来说,像这样的super简单的函数呢?voidfoo(){}/*thisone*/classA{intx_;public:x()const{returnx_;}/*...andthisone*/}?我想要一个仅基于标准的答案,最重要的是,也可能是GCC和clang所做的。
std::variant提供以下访问功能:std::get_if:将pointer指向variant,将pointer返回给alternative。templateauto*std::get_if(std::variant*pv)noexcept;Ifpvisnotanullpointerandpv->index()==I,returnsapointertothevaluestoredinthevariantpointedtobypv.Otherwise,returnsanullpointervalue.这意味着get_if的实现大致如下所示:templateauto*std::get
当调用使用noexcept限定符声明的其他函数时,C++11是否对inline函数或方法提供任何保证?classMy_String{...constchar*c_str()constnoexcept;inlineoperatorconstchar*()const{returnc_str();}};我假设优化编译器可以根据noexcept资格自由实现内联方法,而无需完全EH和堆栈展开。我也希望这也适用于简单的访问器方法:...inlineoperatorconstchar*()const{returnm_buffer;}虽然这个例子看起来微不足道,但异常保证在用于实现其他类或函数时很重要
最近在我的代码中,我一直明确地在我知道会抛出异常的函数上编写noexcept(false),主要是为了阅读代码的人。但是,我想知道这是否会影响我的代码的行为或编译器解释它的方式。这有什么区别吗?注意:我知道析构函数是隐式的noexcept并且您必须指定noexcept(false)才能更改它,我想知道其他函数。 最佳答案 没有异常说明符和显式声明noexcept(false)是等效的,请参阅§15.4/12:Afunctionwithnoexception-specificationorwithanexception-specifi
正如cppreference.com所说,Mapsareusuallyimplementedasred-blacktrees.所以move一个std::map只是将指针move到根节点+其他信息如大小。为什么std::map的move构造函数没有标记为noexcept? 最佳答案 这是因为我无法说服所有的实现者进入可以放入map的无资源状态。例如,一个实现需要有一个端节点指向,即使在默认构造状态下也是如此。允许(但不是必需)实现将该端节点放在堆上。Amoved-frommapmustbeinavalidstate.IE。当end()
这个问题在这里已经有了答案:WhenshouldIreallyusenoexcept?(9个回答)关闭6年前。使纯虚函数noexcept是好事还是坏事?我一直认为我们不应该对其实现类施加额外的限制,即它们的实现不应该抛出,因为这样做可能会导致实现中的修改和不必要的trycatchblock以防止异常逃逸。我认为实现应该决定函数是否可以标记为noexcept而不是异常规范应该决定实现?如果我在这里错了,有人可以纠正我吗?
无论我在哪里看,当移动构造函数为noexcept(false)时,标准库似乎都必须调用复制构造函数而不是移动构造函数。现在我不明白为什么会这样。而且更多的VisualStudioVCv140和gccv4.9.2似乎以不同的方式执行此操作。我不明白为什么noexcept这是一个问题,例如。vector。我的意思是如果T不支持,vector::resize()应该如何提供强大的异常保证。正如我所见,vector的异常级别将取决于T。无论是否使用复制或移动。我理解noexcept只是向编译器眨眼以进行异常处理优化。这个小程序在用gcc编译时调用复制构造函数,在用VisualStudio编译时
我知道noexcept只是提供信息,gcc/clang不会触发此代码段的任何警告/错误:voidfoo()noexcept{throw1;}intmain(){foo();return0;}那么-有没有办法或技术来标记一个函数不抛出任何东西,如果实现抛出,实际上从编译器获得编译时警告/错误?一个简单的用例-我有一个框架,它公开了一组客户端插件应该实现的接口(interface),然后框架从共享对象加载插件,通过工厂实例化接口(interface)并调用接口(interface)方法。我希望在调用期间不会在库边界上抛出异常,因此我想将插件实现的接口(interface)中的所有函数标记为
我观看了ScottMeyers在GoingNative2013“AnEffectiveC++11/14Sampler”上的演讲,他解释了std::move_if_noexcept的使用。所以我认为应该有一个std::forward_if_noexcept来保证forward的异常安全?为什么标准库中没有这样的东西?有没有其他保证的可能? 最佳答案 前向语义已经是有条件的,即它们保留其参数的值类别。另一方面,移动无条件地将其参数的值类别(从左值变为右值)更改为右值(引用),std::move_if_noexcept获得基于移动构造函数