函数类型定义中是否接受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())){...}这里的问题当
我遇到了无法解释的编译器错误,也无法在网上找到相关信息。我最近在包装器类的析构函数中添加了一个noexcept说明符,现在大量从使用此包装器的类继承的类无法编译。我已经用GCC4.9试过了,没有编译器错误。我正在使用VisualStudioProfessional2015版本14.0.25431.01更新3考虑以下重现问题的最小代码:#includetemplatestructmember{~member()noexcept(std::is_nothrow_destructible::value){};};structparent{virtual~parent()noexcept=de
C++标准有时会使用短语“不得抛出异常”,例如在17.6.3.4中枚举Hash要求时。这是否意味着符合标准的实现必须将std::hash的调用运算符标记为noexcept或者这只是意味着从在散列仿函数内会导致未定义或实现定义的行为?我检查了libstdc++和libc++都将std::hash的调用运算符标记为noexcept,但我想了解这是否是必需的行为. 最佳答案 “要求:你不能扔”的意思就是你猜的:如果你扔,你会得到未定义的行为。此外,17.6.5.12[res.on.exception.handling]/p1允许实现者添加
有问题的代码是#include#includetemplatevoidfor_each(F&&)noexcept{}templatevoidfor_each(F&&f,T&&v,Us&&...us){std::invoke(std::forward(f),std::forward(v));for_each(std::forward(f),std::forward(us)...);}voidfunc(void*)noexcept{}intmain(){for_each(func,nullptr);}它在gcc8上编译,但在clang6上失败并出现以下错误:/opt/wandbox/cla
在此示例代码中:explicitMyClass(std::wstringtext)noexcept;这里使用noexcept正确吗?wstring可能会在构造时抛出,但是抛出发生在我们在构造函数之前还是在我们在构造函数中时?编辑:假设这可以推广到任何采用按值参数的函数。 最佳答案 函数参数的构造和销毁发生在调用者的上下文中。所以不,如果text的构造抛出,那不违反noexcept。很快人们就会发表评论并要求提供规范报价:)所以我会给你5.2.2p4Theinitializationanddestructionofeachparame
我有以下片段:#include#includeintmain(intargc,char**argv){intx[2][3];inty[2][3];usingstd::swap;std::cout使用GCC4.9.0,这将打印0。我不明白为什么。根据标准,std::swap有两个重载:namespacestd{templatevoidswap(T&a,T&b)noexcept(is_nothrow_move_constructible::value&&is_nothrow_move_assignable::value);templatevoidswap(T(&a)[N],T(&b)[N]