我遇到了无法解释的编译器错误,也无法在网上找到相关信息。我最近在包装器类的析构函数中添加了一个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
此代码在g++(coliru)中编译良好,但在MSVC中编译不正常(godbolt和我的VS2017)。#include#includetemplatevoidf(){constexprboolb=std::is_same_v;//#1autofunc_x=[&](){ifconstexpr(b){//#error}else{}};func_x();}intmain(){f();}(6):errorC2131:expressiondidnotevaluatetoaconstant(6):note:failurewascausedbyareadofavariableoutsideitsl
在此示例代码中: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]
我刚刚发现basic_string的两个交换函数(成员函数和命名空间std中的函数)没有用noexcept声明——既不是在GCC-4.8的标准库中,也不是在最新的C++草案N3690。另一方面,移动构造函数和移动赋值运算符是用noexcept声明的。这说明应该可以提供noexcept交换函数。问题:没有用noexcept声明交换函数的原因是什么?更新:问题是我想在我自己的交换函数中使用一个模板函数,它使用static_assert来检查交换实际上是noexcept,例如:structfoo{bar_tbar;baz_tbaz;voidswap(foo&rhs)noexcept{swap
即使v.at(idx)理论上可以抛出out_of_range异常,但声明以下函数noexcept是否安全,但实际上不是因为边界检查?intget_value_or_default(conststd::vector&v,size_tidx)noexcept{if(idx>=v.size()){return-1;}returnv.at(idx);} 最佳答案 您对“安全”的定义是什么?如果您在标记为noexcept或noexcept(true)的函数中抛出异常,那么您的程序将被终止(标准15.4.9)Wheneveranexceptio
给定:templateinlineboolf(Tn){returnn>=0&&n当与unsigned类型一起使用时会产生警告:unsignedn;f(n);//warning:comparisonn>=0isalwaystrue当T是unsigned类型时,有什么聪明的方法不进行比较n>=0吗?我尝试添加部分模板特化:templateinlineboolf(unsignedTn){returnn但是gcc4.2.1不喜欢这样。(无论如何,我认为那种部分模板特化是不合法的。) 最佳答案 您可以将enable_if与is_unsigne
std::shared_ptr如何提供noexceptoperator=?当然,如果这个shared_ptr是最后一个,那么它必须销毁它的内容,并且不能保证那个对象的析构函数不会抛出,或者原来使用的自定义删除器不会扔。 最佳答案 对我来说似乎是个缺陷,虽然我在activeissueslist中找不到一个(虽然#2104类似)。根据[C++11:20.7.2.2.3/1],赋值定义为等价于shared_ptr(r).swap(*this);但根据[C++11:20.7.2.2.2],~shared_ptr本身不是noexcept。除非