草庐IT

noexcept-ness

全部标签

c++ - 递归 noexcept 规范

用g++4.9和clang3.4测试,为什么这段代码不能编译:namespace{templateconstexprautof(T&&t)noexcept{returntrue;}templateconstexprautof(T&&t,Ts&&...ts)noexcept(noexcept(f(ts...))){returnf(ts...);}}//namespaceintmain(){f(true,0,5u);}但这段代码确实:namespace{templateconstexprautof(T&&t)noexcept{returntrue;}templateconstexpraut

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++ - Clang、std::next、libstdc++ 和 constexpr-ness

采用以下代码:#includeconstexprstd::arraya{};static_assert(std::next(std::begin(a))==std::begin(a)+1);使用-std=c++17GCC可以完美地编译它,但Clang会提示该表达式不是整型常量表达式。看起来问题出在std::next上,但是在C++17中应该是constexpr。尽管如此,std::next在std库中,而不是在编译器本身中,因此发生了一些奇怪的事情。为了让事情变得更好,如果您将-stdlib=libc++传递给Clang,该示例将完美编译。这是怎么回事?谁对谁错?编辑这个问题似乎与cl

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++ - 为什么允许在 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++ - 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++ - 我什么时候应该声明一个没有 noexcept 的移动构造函数?

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

c++ - 标准中override和noexcept的顺序

override和noexcept的顺序是标准要求的吗?classBase{public:virtualvoidfoo(){}};classDerived:publicBase{public://virtualvoidfoo()override{}//Ok//virtualvoidfoo()noexcept{}//Ok//virtualvoidfoo()noexceptoverride{}//Okvirtualvoidfoo()overridenoexcept{}//Error};intmain(){}我正在使用gcc4.7.2。 最佳答案