草庐IT

Noexcept

全部标签

c++ - Noexcept 对派生类构造函数的 promise : can that be used without promising noexcept on base constructor?

假设我有一个类classC:publicB{public:C()noexcept;}noexcept说明符是否需要基类的相同promise?也就是说,当我考虑使用noexcept时,我是只看C::C()的行为还是我还需要考虑B::B()是否可能抛出异常?例如,如果B::B抛出异常,它会传播到C::C还是传播到请求新类实例的代码?--如果传播到C::C,如果基类不是noexceptforconstructor,那将是避免noexceptforconstructor的原因之一。 最佳答案 技术上†不要求将基类构造函数声明为noexcep

c++ - noexcept 规范中是否允许使用 `this`?

我有一些代码要求我使用*this,但我希望它是noexcept友好的:structfoo;//Wouldactuallybesomethingwithconditionalnoexceptvoiddo_something(foo&);structfoo{voidfn()noexcept(noexcept(::do_something(*this))){::do_something(*this);}};然而,gccrejectsthis::7:43:error:invaliduseof'this'attoplevelnoexcept(noexcept(::do_something(*th

c++ - 如果类包含标准容器,我可以将类 move 操作标记为 noexcept 吗?

在具有标准容器成员的类上实现move操作的惯用方法不能是noexcept因此不能通过vector.push_back()等操作move.还是我弄错了?从中获取速度vectordata;//...data.push_back(elem);鼓励我们进行move操作noexcept--因此在vector调整大小时,库可以安全地将元素move到重新分配的存储空间。classElem{//...Elem(Elem&&)noexcept;//noexceptimportantformoveElem&operator=(Elem&&)noexcept;//noexceptimportantformo

c++ - 为什么 unique_ptr operator* 不是 noexcept?

这个问题在这里已经有了答案:"No-throwdereferencing"ofstd::unique_ptr(1个回答)关闭4年前。在为我的爱好操作系统实现一个基本的std库时,我遇到了这个并想知道为什么:operator->()和T*get()都被标记为noexcept,但是operator*()不是。根据引用资料,它应该等同于*get(),这将允许它成为noexcept并查看一些实现,我看不出为什么不是。为什么unique_ptr的取消引用运算符没有标记为noexcept?

c++ - 在可见性有限的 `std::terminate` 函数中调用 `noexcept` - gcc vs clang codegen

考虑以下代码片段:voidf();voida(){f();}voidb()noexcept{f();}在上面的场景中,f的主体对于当前翻译单元中的编译器是不可见的。因此,由于b被标记为noexcept,必须在调用方生成额外的代码以确保异常被捕获并且std::terminate被调用。这就是clang++-Ofast-std=c++2a所做的(主干版本):a():#@a()jmpf()#TAILCALLb():#@b()pushraxcallf()popraxretmovrdi,raxcall__clang_call_terminate__clang_call_terminate:#@_

c++ - 为什么 noexcept 构造函数需要实例化析构函数?

在下面的代码中,一个wrapper声明的对象包含movable,其中T是一个不完整的类型。movable的析构函数使得它不能在没有完全了解T的情况下被实例化。,但是wrapper的析构函数只是前向声明的,这意味着如果~movable()就足够了在~wrapper()的定义点实例化.#includetemplatestructmovable{movable()noexcept=default;~movable()noexcept{(void)sizeof(T);}movable(constmovable&)noexcept=delete;movable(movable&&)noexcep

c++ - noexcept 究竟包含什么构造函数?

根据C++标准,类构造函数上的noexceptnoexcept-specification究竟适用于什么?函数体?在可选的ctor-initializer中初始化成员?在可选的mem-initializer中初始化基类?在可选的mem-initializer中初始化类成员?复合语句?函数尝试block?未在ctor-initializer中初始化对象基类的初始化?未在ctor-initializer中初始化对象类成员的初始化?还有什么吗?换句话说,noexceptnoexcept-specification包含以上哪些内容(即触发std::terminate()时如果noexcept(

c++ - 将已删除的函数声明为 noexcept 有什么意义吗?

考虑一个类的这两个可能的定义:图表A:structA{A()=delete;};图表A′:structA{A()noexcept=delete;}将已删除的函数声明为noexcept有什么意义吗? 最佳答案 (最初作为评论发布,但鼓励作为答案发布。)简单地说,不。不能调用被删除的函数(或者,在构造函数的情况下,用于初始化对象)更不用说抛出异常了。编辑:hvd在下面的评论中提到noexcept(f())不会调用f()。如果类A的构造函数是deleted,那么noexcept(A())将编译失败,无论是否声明构造函数没有异常(excep

c++ - 在调用 C 函数的其他不抛出内联函数上添加 noexcept?

我已经为一些C库实现了C++绑定(bind)。库API调用可以失败,但显然不能抛出任何东西;出于这个问题的目的,我的绑定(bind)都是内联的。现在,对于我的大多数内联函数/方法,编译器可以确定不能抛出异常;例如,假设我有:boolfoo(){autoresult=wrapped_lib_foo();returnsome_constexpr_nothrow_cond(result);}我应该用noexcept标记这样的函数/方法吗?注意事项:不是ShouldIusenoexceptforsimplefunctionsthatobviouslycannotthrow?的骗子,因为在那种情

c++ - 如何为 noexcept 函数指针创建别名?

我想这样做:usingfunction_type=void(*)(void*)noexcept;但是我得到一个错误“类型别名中不允许异常规范”。(Xcode6.1版本中的clang)是否有解决方法来创建带有noexcept说明符的别名?我正在寻找能够按照跨平台功能的语言(而非扩展)定义的东西。 最佳答案 该标准明确禁止异常规范出现在typedef或别名声明中。但它也指出异常说明符可能出现在函数指针类型中。§15.4/2[except.spec]Anexception-specificationshallappearonlyonafu