草庐IT

noexcept-ness

全部标签

c++从decltype返回类型中删除noexcept

#include#include#includestd::functionmockbind=::bind;intmain(){}上面的代码适用于我编译的大多数平台。但是在使用g++-7的ubuntu14.04上我得到一个错误:X.cpp:7:65:error:variable‘std::functionmockbind’hasinitializerbutincompletetypestd::functionmockbind=::bind;^~~~~~~~现在,如果我手动更改mockbind的类型std::functionmockbind=::bind;不出所料,我得到了同样的错误:现在

c++ - C++ 标准对使用 noexcept 覆盖 throw() 函数有何规定?

以下似乎可以在我试过的几个编译器上编译:classA{public:virtualvoidfoo()throw()=0;};classB:publicA{public:virtualvoidfoo()noexceptoverride{}};似乎可以用较新的noexcept规范覆盖throw()函数。我也尝试了相反的方法(用throw()覆盖noexcept),它似乎有效。这是为什么?这是未定义的行为还是允许的?请注意,代码生成受noexcept与throw()的影响。它们也没有等效的行为,因为noexcept调用的终止函数与throw()不同。一个理想的答案是指出行为差异以及它们在这种

c++ - 在什么情况下 C++ 编译器会推断出 noexcept?

假设C++编译器正在编译一个函数,该函数的定义在与其调用相同的翻译单元中可用。假设它既不抛出自身也不调用已知抛出的函数。还假设没有调用externC代码,也没有调用具有潜在零值的数字除法。在这些假设下,编译器会将函数视为noexcept吗?如果不是,是否还有其他条件可以推断出noexcept?具体来说,像这样的super简单的函数呢?voidfoo(){}/*thisone*/classA{intx_;public:x()const{returnx_;}/*...andthisone*/}?我想要一个仅基于标准的答案,最重要的是,也可能是GCC和clang所做的。

c++ - 不安全, `noexcept` 和访问 `std::variant` 的无开销方式

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

C++11 noexcept 限定符和内联方法

当调用使用noexcept限定符声明的其他函数时,C++11是否对inline函数或方法提供任何保证?classMy_String{...constchar*c_str()constnoexcept;inlineoperatorconstchar*()const{returnc_str();}};我假设优化编译器可以根据noexcept资格自由实现内联方法,而无需完全EH和堆栈展开。我也希望这也适用于简单的访问器方法:...inlineoperatorconstchar*()const{returnm_buffer;}虽然这个例子看起来微不足道,但异常保证在用于实现其他类或函数时很重要

c++ - 添加 `noexcept(false)` 是否对代码有任何好处?

最近在我的代码中,我一直明确地在我知道会抛出异常的函数上编写noexcept(false),主要是为了阅读代码的人。但是,我想知道这是否会影响我的代码的行为或编译器解释它的方式。这有什么区别吗?注意:我知道析构函数是隐式的noexcept并且您必须指定noexcept(false)才能更改它,我想知道其他函数。 最佳答案 没有异常说明符和显式声明noexcept(false)是等效的,请参阅§15.4/12:Afunctionwithnoexception-specificationorwithanexception-specifi

c++ - 为什么 std::map 的 move 构造函数不是 noexcept?

正如cppreference.com所说,Mapsareusuallyimplementedasred-blacktrees.所以move一个std::map只是将指针move到根节点+其他信息如大小。为什么std::map的move构造函数没有标记为noexcept? 最佳答案 这是因为我无法说服所有的实现者进入可以放入map的无资源状态。例如,一个实现需要有一个端节点指向,即使在默认构造状态下也是如此。允许(但不是必需)实现将该端节点放在堆上。Amoved-frommapmustbeinavalidstate.IE。当end()

c++ - 制作纯虚函数 noexcept 的好的或坏的做法

这个问题在这里已经有了答案:WhenshouldIreallyusenoexcept?(9个回答)关闭6年前。使纯虚函数noexcept是好事还是坏事?我一直认为我们不应该对其实现类施加额外的限制,即它们的实现不应该抛出,因为这样做可能会导致实现中的修改和不必要的trycatchblock以防止异常逃逸。我认为实现应该决定函数是否可以标记为noexcept而不是异常规范应该决定实现?如果我在这里错了,有人可以纠正我吗?

c++ - 尽可能多地维护 "const-ness"是个好主意吗?

最近,我一直在养成一种习惯,将我的代码中的许多东西作为const:(1)函数参数,我知道永远不会改变。例如:voidfoo(constinti,conststrings)^^^^^^^^^^(2)返回类型作为const。例如:structA{...constintfoo(){return...;}^^^^^operatorconstbool()const{return...;}^^^^^};(3)整数或字符串的简单计算。例如:constuintsize=vec.size();^^^^^conststrings2=s1+"hello";^^^^^...还有其他一些地方。通常在其他现实世界

c++ - Noexcept 和复制、移动构造函数

无论我在哪里看,当移动构造函数为noexcept(false)时,标准库似乎都必须调用复制构造函数而不是移动构造函数。现在我不明白为什么会这样。而且更多的VisualStudioVCv140和gccv4.9.2似乎以不同的方式执行此操作。我不明白为什么noexcept这是一个问题,例如。vector。我的意思是如果T不支持,vector::resize()应该如何提供强大的异常保证。正如我所见,vector的异常级别将取决于T。无论是否使用复制或移动。我理解noexcept只是向编译器眨眼以进行异常处理优化。这个小程序在用gcc编译时调用复制构造函数,在用VisualStudio编译时