草庐IT

Noexcept

全部标签

c++ - 为什么 std::map find() 没有声明为 noexcept?

C++14标准定义std::map的find()成员函数如下:iteratorfind(constkey_type&x);const_iteratorfind(constkey_type&x)const;为什么这些函数没有定义为noexcept?内部可能出现什么问题,这将需要抛出异常或产生未定义的行为(除了找不到元素,在这种情况下函数返回end迭代器并且无论如何都不需要抛出异常)? 最佳答案 find()基于map的Compare()方法,这可能会引发异常(想象一下复杂键可能不正确的情况).因此,我们不能确定find()不会引发异常

c++ - 为什么 std 智能指针类型析构函数不继承指向对象的 noexcept dtor 状态

在C++11中,我的理解是默认情况下析构函数是隐式的noexcept(true),除了:如果我有一个类C有一个显式标记为noexcept(false)的析构函数(大概是因为它出于某种奇怪的原因抛出,我知道你不应该,为什么)然后是派生自C的任何类的析构函数或包含C类型的成员也变成noexcept(false).但是,一个包含std::shared_ptr的类显然不会自动将其析构函数切换为noexcept(false),包含std::weak_ptr也是如此,std::unique_ptr等这是一个完整的例子:#include#includestructNormal{~Normal(){}

c++ - 如何在类 noexcept 之外定义默认构造函数?

我知道标记为=default的构造函数将尽可能“尝试”为noexcept。但是,如果我在类的外部定义它,它就不再是noexcept,您可以从这段代码中看到:#include#include#includestructBar{Bar()=default;Bar(Bar&&)=default;//noexcept};structFoo{Foo()=default;Foo(Foo&&);};//movingthedefinitionoutsidemakesitnoexcept(false)Foo::Foo(Foo&&)=default;//notnoexceptanymoreintmain(

c++ - 在实现非抛出交换时我应该使用 throw() 吗?

在实现非抛出交换习语时,我应该使用throw()吗?namespaceA{structB{voidswap(B&other)throw(){/*fancystuffthatdoesn'tthrow*/}};voidswap(B&lhs,B&rhs)throw(){lhs.swap(rhs);}}namespacestd{templatevoidswap(A::B&lhs,A::B&rhs)throw(){lhs.swap(rhs);}}我特别担心将throw()规范放在std::swap的特化上。奖励问题:使用C++0x的noexcept关键字时答案是否不同?

c++ - 为什么允许在 noexcept 标记的函数中抛出异常?

我很难理解这一点。doublecompute(doublex,doubley)noexcept{if(y==0)throwstd::domain_error("yiszero");returnx/y;}这在clang中编译得很好(我没有检查gcc),但对我来说这似乎是胡说八道。为什么编译器会允许noexcept函数包含throw语句? 最佳答案 将发生的是std::terminate()被触发,因为您的异常规范不允许发生这种情况(参见[except.spec/9])。至于为什么允许这样做,根本不可能彻底检查是否有任何违反规范的地方。

c++ - 如果对象的构造函数是noexcept,placement new(expression)可以抛出吗?

templatestructObj{//PlainOldDataforTusingInternalPod=typenamestd::aligned_storage::value>::type;InternalPodvalue_pod_;templateObj(Args&&...args){//myconstructor//placementnew:constructthevalueinthestaticallyallocatedspacenew(&value_pod_)T(std::forward(args)...);//Normalnew可以在分配失败或构造失败时抛出(如果有其他情况

c++ - 默认的默认构造函数可以抛出吗?

默认的默认构造函数由C++编译器生成,用户无法控制它们。他们能扔吗?声明一个的时候指定noexcept可以吗?下面的代码可以用gcc编译。structA{A()=default;};structB{B()noexcept=default;};intmain(){Aa;Bb;return0;} 最佳答案 允许将noexcept说明符添加到默认的特殊成员函数(默认构造函数、复制构造函数、赋值运算符等)。default声明的特殊成员函数将有一个noexcept说明符,具体取决于所涉及函数的noexcept说明符(其隐含的noexcept说

c++ - std::move_if_noexcept 的基本原理仍在 move 抛出仅 move 类型?

move_if_noexcept将:返回一个右值——促进move——如果move构造函数是noexcept或者如果没有复制构造函数(仅move类型)返回一个左值——强制复制——否则我发现这相当令人惊讶,因为具有抛出move-ctor的仅move类型仍将由使用move_if_noexcept的代码调用此move-ctor。是否对此给出了详尽的理由?(也许直接或在N2983的两行之间?)代码不编译而不是仍然不得不面对不可恢复的move场景会不会更好?N2983中给出的vector示例很好:voidreserve(size_typen){......new((void*)(new_begin

c++ - 浮点乘法可以在 C++ 中抛出异常吗?

这可能吗?我不认为是,但我不知道这是标准会说的,还是实现定义的?我问是因为我想知道像这样标记一个constexpr函数是否安全或值得noexcept例如:constexprdoubleto_meters(doubley)noexcept?{returny*10;}constexprdoublex=to_meters(y);//Clang-Tidywarnsaboutpossibleexceptionwithoutnoexcept 最佳答案 不,float乘法通常不会抛出C++异常。但是想一想:clang-tidy怎么可能知道to_m

c++ - 我什么时候应该声明一个没有 noexcept 的移动构造函数?

标准不对移动构造函数强制执行noexcept。在什么情况下可以/必须抛出移动构造函数? 最佳答案 当你真的别无选择时。大多数时候你的移动构造函数应该是noexcept。它们是默认设置。看这个:http://www.codingstandard.com/rule/12-5-4-declare-noexcept-the-move-constructor-and-move-assignment-operator/Itisespeciallyimportanttousenoexceptfortypesthatareintendedtobeu