草庐IT

noexcept-ness

全部标签

c++ - 使用 SFINAE 检测 C++ 中类型的 POD-ness

这里的原标题是解决VS2005C++中SFINAE错误的方法这是尝试性地使用SFINAE来为TR1中存在的is_pod模板类创建等效项(在VS2005中还没有TR1)。当模板参数是POD类型(包括基本类型和由它们构成的结构)时,它的value成员应该是true,如果不是(就像非平凡的构造函数),它应该是false。templateclassis_pod{public:typedefcharYes;typedefstruct{chara[2];}No;templatestaticYestest(int){union{TvalidPodType;}u;}templatestaticNote

c++ - 定义最大 double 时,“无法在初始化中将 'double (*)() noexcept' 转换为 'double'”

我读到使用最大double值的标准C++方法是std::numeric_limits::max.然后在我想要将我的double初始化为我使用的最大double的每个函数中:#include#defineMAX_DOUBLE(std::numeric_limits::max)使用gcc-pedantic-pedantic-errors-Wall-Wextra-Werror,我得到以下错误:Cannotconvert'double(*)()noexcept'to'double'ininitialization你能解释一下这个错误吗? 最佳答案

C++17类模板推导const-ness

我正在尝试使用新的c++17类模板推导,在我应用const之前它似乎一切正常。这是我面临的麻烦的一个小例子:#includetemplatestructX{T_data;X(void)=default;X(T&&data):_data{data}{}constexprboolconst_x(void){returnfalse;}constexprboolconst_x(void)const{returntrue;}};templateX(T&&)->X>;intmain(void){Xa;constXb{};Xc{10};constXd{10};static_assert(!a.con

c++ - array::operator[] 实际上是 noexcept 吗?

根据cppref,当前未指定重载noexcept。但我认为它们实际上是noexcept,对吧?由于不执行边界检查。所以没有像array::at这样的out_of_range异常.如果输入超出范围,就会发生低级段错误或访问冲突,这超出了C++异常范围(我猜)。 最佳答案 operator[]没有标记为noexcept的原因是它有一个“窄契约”,即要求索引值在范围内0...N-1。如果传递的值不在该范围内,则行为未定义,并且(谁知道?)函数可能会抛出异常。关于不将具有“狭义契约”的事物标记为noexcept,该标准非常一致。这被非正式地

c++ - 为什么 N3421 不提供 noexcept 限定词?

在N3421-MakingOperatorFunctorsgreater,std函数对象的新特化是:templatestructplus{templateautooperator()(T&&t,U&&u)const->decltype(std::forward(t)+std::forward(u));};代替templatestructplus{templateautooperator()(T&&t,U&&u)constnoexcept(noexcept(decltype(std::forward(t)+std::forward(u))(std::move(std::forward(t

c++ - noexcept 运算符在调用指向成员函数的指针后失败

这个MWE可能看起来做作,但失败的static_assert仍然令人惊讶:#includestructC{voidf()noexcept{}usingF=void(C::*)();staticconstexprFhandler()noexcept{return&C::f;}voidg()noexcept(noexcept((this->*handler())())){}};intmain(){static_assert(noexcept(std::declval().g()));}魔杖链接:https://wandbox.org/permlink/a8HSyfuyX1buGrbZ我希望

c++ - 关于 noexcept 参数

noexcept的使用对我来说非常清楚,因为现代优化的标记函数的方法具有不抛出异常保证structA{A()noexcept;};在effectivemodernc++的item14中,我遇到了以下语法,称为conditionallynoexcepttemplatevoidswap(T(&a)[N],T(&b)[N])noexcept(noexcept(swap(*a,*b)));我的理解是,noexcept可以引入一个真值上下文,但是另一个noexcept怎么可能成为一个论点?有人可以详细说明这种使用noexcept的语法和语义吗? 最佳答案

c++ - 我什么时候应该真正使用 noexcept?

noexcept关键字可以适本地应用于许多函数签名,但我不确定何时应该考虑在实践中使用它。根据我目前所读的内容,最后添加的noexcept似乎解决了移动构造函数抛出时出现的一些重要问题。但是,对于一些实际问题,我仍然无法提供令人满意的答案,这些问题促使我首先阅读了有关noexcept的更多信息。有许多我知道永远不会抛出但编译器无法自行确定的函数示例。在所有此类情况下,我是否应该将noexcept附加到函数声明?必须考虑是否需要在每个函数声明后附加noexcept会大大降低程序员的工作效率(坦率地说,这会让人头疼).在哪些情况下我应该更加小心地使用noexcept,在哪些情况下我可以使用

c++ - 为什么 noexcept 说明符不在声明的方法范围内?

试图设计一些无异常的类,我有一个类似于此的继承结构,但我发现noexcept说明符在使用成员函数作为说明符时几乎没有帮助不在函数范围内。classBase{protected:Base()noexcept{}};classDerived:publicBase{public://error:'Base::Base()'isprotectedDerived()noexcept(noexcept(Base{})):Base{}{}//error:'foo'wasnotdeclaredinthisscopeDerived(int)noexcept(noexcept(foo())){}//err

c++ - noexcept 运算符和 enable_if_t : do they work together?

考虑以下类:structS{templatestd::enable_if_t::value>f()noexcept{}templatestd::enable_if_t::value>g()noexcept{}};正如预期的那样,编译:s.f();这个不是:s.g();令我困惑的是,下面的main是用GCC(6.2)编译的,而不是用clang(3.9)编译的:intmain(){static_assert(noexcept(&S::f),"!");static_assert(noexcept(&S::g),"!");}我会说第二个断言失败是因为特化无效。两个编译器不同意这一点。哪个是正确