似乎在至少某些编译器(GCC5.2和VisualC++2015Update1)的现代版本中,当存在已初始化的类成员时,会错误地生成noexcept默认构造函数:#include#include#includestructE{};structA{A(){throwE();}};structB{Aa;};structC{std::shared_ptrb{std::make_shared()};//C(){}//uncommenttofix};intmain(){try{newC;}catch(constE&){std::cout运行此代码会导致在GCC5.2(C++14模式)和Visual
此代码使用gcc4.8.2(-std=c++11)编译失败,但使用clang3.4(trunk)(-std=c++11)编译:#include#includestructX{X&operator=(X&&)noexcept=default;//addingnoexceptthisleadstoanerroringcc,butworksinclang://function‘X&X::operator=(X&&)’defaultedonitsfirst//declarationwithanexception-specificationthatdiffersfromthe//implicit
简单的问题:如果改变这个:voidsomeMethod();到voidsomeMethod()noexcept;它会破坏二进制兼容性,还是方法签名保持不变? 最佳答案 方法签名是否保持不变?是的。https://en.cppreference.com/w/cpp/language/noexcept_spec:Functionsdifferingonlyintheirexceptionspecificationcannotbeoverloaded(justlikethereturntype,exceptionspecification
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题吗?更新问题,以便editingthispost提供事实和引用来回答它.关闭6年前。Improvethisquestion在浏览C++0x工作草案的最后一次编辑时,我发现了很多删除关键字noexcept在同一位置添加文本抛出:什么都没有反之亦然。只是一些例子:替换noexcept针对抛出:无:20.6.4指针安全[util.dynamic.safety]templateT*undeclare_reachable(T*p);添加noexcept:20.6.3.2。指针特征成员函数[pointer.traits.
我正在尝试编写异常安全代码。我发现使用C++11的noexcept说明符使这个目标更容易实现。当然,一般的想法是,当且仅当它调用的所有函数也都标记为“noexcept”时,一个函数才应该标记为“noexcept”。问题在于,在大型代码库中,来自不同人的补丁经常合并在一起,很难确保保持这种一致性。所以我希望能够运行静态分析,该分析可以列出标记为“nothrow”的函数调用未标记为“nothrow”的函数的所有位置。据我在手册页中看到的,GCC无法帮助我。有没有可以帮助我的独立工具?或者其他一些编译器? 最佳答案 如果您通过使用程序的A
函数类型定义中是否接受noexcept说明符?如:typedefvoid(*fptr)()noexcept;直观地说,noexcept说明符似乎很有意义,因为它们允许在调用方进行一些优化。我从gcc4.6.1得到的答案不一。typedefvoid(*fptr)()noexcept;结果:错误:使用异常规范声明的“fptr”但是:templatestructA{};编译没有警告。 最佳答案 clang给出:test.cpp:1:25:error:exceptionspecificationsarenotallowedintypedef
std::deque的pop_front()和pop_back()有什么原因不是noexcept在C++11及更高版本中还是刚刚被遗忘? 最佳答案 如果我理解正确,该标准没有在具有狭窄契约(Contract)的函数上指定noexcept(前提条件是违反导致UB)。N3279以及最近P0884正在讨论这个以及如何决定一个函数是否应该是noexcept(或有条件地)。std::deque的pop_front和pop_back也是如此,front和back没有调用析构函数的地方。例如std::vector的pop_back、front和b
如果声明的函数具有noexcept说明符(noexcept、noexcept(true)、noexcept(false),或任何其他noexcept(expr)评估为true或false),但它是在另一个地方定义的,我需要指定noexcept说明符再次出现在定义中,还是仅出现在其前向声明中? 最佳答案 [except.spec]/p4:Ifanydeclarationofafunctionhasanexception-specificationthatisnotanoexcept-specificationallowingallex
代码:structT{T(){}};structS{Tt;S()noexcept=default;};intmain(){//Ss;}g++4.9.2接受这一点,没有错误或警告,但是clang3.6和3.7报告第7行:error:exceptionspecificationofexplicitlydefaulteddefaultconstructordoesnotmatchthecalculatedone但是,如果Ss;行没有被注释掉,g++4.9.2现在会报告:noex.cc:Infunction'intmain()':noex.cc:12:7:error:useofdeletedf
noexcept修饰符可以应用于lambda表达式吗?如果有,怎么做?noexcept可以作为函数参数的约束吗?比如下面的代码,意思就是回调函数必须是noexcept?//probablynotvalidcode-I'mjusttryingtoexpresstheideavoidf_async(std::functioncallback)noexcept{...}这几乎可以用下面的代码来完成,但我想知道是否有办法使用上述替代方法。voidf_async(std::functioncallback)noexcept(callback(std::declval())){...}这里的问题当