exception-specification相关内容

为什么C ++使用throw()关键字指示函数不会抛出任何异常

此关键字是否有点违反直觉? 该函数不会引发任何异常,因此我们向其添加了throw()标记.应该是silent()还是类似的东西? 解决方案 从C ++ 17以前的角度来看:它可能是违反直觉的,但只是一会儿. throw(type,type,...)提供该函数可能抛出的异常类型的列表. throw()提供了一个 empty 类型列表,即该函数不能抛出任何类型的异常. ..
发布时间:2021-05-06 18:49:37 C/C++开发

c ++ 1z动态异常规范错误

我正在尝试使用新的GCC版本7.2.1编译我的项目,并且在动态异常规范方面存在问题: error: ISO C++1z does not allow dynamic exception specifications MEMORY_ALLOC_OPERATORS(SQLException) 问题是这些错误来自我无法控制的第三方库. 有什么办法可以解决?据我所知,我不能告诉编译器 ..
发布时间:2020-07-23 01:32:10 C/C++开发

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

考虑一个类的以下两种可能的定义: 展览A: struct A { A() = delete; }; 图A': struct A { A() noexcept = delete; } 将已删除的函数声明为noexcept有什么意义吗? 解决方案 (最初将其发布为评论,但建议将其发布为答案.) 不,不.不能调用已删除的函数(或者在构造函数的情况下 ..

为什么用新语法noexcept重写旧的空投规范?

标题说明了一切:为什么C ++放弃了完美令人满意,有用的空抛出规范throw() ,用另一种语法替换了它,并引入了新的关键字noexcept? 空抛出规范是“仅抛出这些枚举异常保证"(写为throw(X,Y,Z)),但枚举异常为零:不是抛出X,Y或Z(以及派生类型),您可以抛出空集:这是确保函数从不向调用者抛出任何东西的保证,换句话说,是永不抛出或“不抛出"规范. 那是使用实质上相同的 ..

转换到C ++ 11,其中析构函数被隐含地声明为noexcept

在C ++ 11中,没有任何异常规范的析构函数被隐含地声明为 noexcept ,这是C ++ 03中的一个变化。因此,C ++ 03中用于抛出析构函数的代码仍然可以在C ++ 11中编译,但是一旦它尝试从这样一个析构函数中抛出,就会在运行时崩溃。 由于这种代码没有编译时错误,如何将代码库中的所有和所有现有的析构函数声明为$ code> noexcept( false),这将是非常冗长和侵入 ..

异常规范

我知道这个功能将在C ++ 0x中被弃用,但对于我来说,作为一个总的新手,它似乎是一个好主意。有人可以向我解释为什么不是一个好主意? 解决方案 请参阅Herb Sutter的详细文章。他对设计的问题和缺点进行了最全面的解释。 实际看看异常细节 http://www.gotw.ca/publications/mill22 .htm ..
发布时间:2017-09-29 12:42:24 C/C++开发

异常规范如何影响虚拟析构函数覆盖?

C ++标准说明了具有异常规范的虚拟函数的以下内容: 如果虚拟函数具有规范,在任何派生类中覆盖该虚函数的任何函数的所有声明(包括定义)只允许基类虚函数的异常规范所允许的异常(C ++ 03§15.4/ 3)。 因此,以下是不正确的: struct B { virtual void f()throw(){} //允许没有异常 }; struct D:B { virtual ..

关于Hinnant的堆栈分配器的问题

我一直在使用Howard Hinnant的堆栈分配器,它的工作方式类似于charm,但实现的一些细节 为什么全局运算符 new 和 delete used? allocate()和 deallocate()成员函数使用 :: operator new 和 :: operator delete 。类似地,成员函数 construct()使用全局布局new。为什么不允许任何用户定义的全局或类特定 ..