std::exception
要求它的构造函数是throw()
. Yet std::runtime_error
接受一个std::string
作为它的参数,这表明它正在存储一个std::string
某处。因此,作业或复制构造必须在某个地方进行。而对于std::string
,这不是一个nothrow
手术。
那怎么办runtime_error::runtime_error
meet throw()
?
(对于上下文,我正在实现一个异常类型,并且想要存储一些std::string
来自呼叫站点,我想正确地执行...)
(Here's http://codepad.org/EcX0Yaqf the same thing in a minimal-ish testcase.)
runtime_error::runtime_error(string const&)
不需要见面throw()
.
它不会继承或覆盖exception::exception()
,到时候string
的复制构造函数被调用,exception::exception()
已完成。
如果复制string
抛出异常,这会放松runtime_error::runtime_error(string const&)
然后,我想,调用exception::~exception()
.
很难直接表明派生构造函数不需要满足基构造函数的异常说明符,但以下段落强烈暗示了这一点(它描述了如何调用基构造函数,而不是将异常传递给基构造函数):
[2003: 15.2/2]
部分构造的对象或
部分销毁将对其所有部分执行析构函数
完全构造的子对象,即对于其
构造函数已执行完毕,析构函数尚未执行
开始执行。是否应该为自动元素的构造函数
数组抛出异常,仅该数组的构造元素
将被摧毁。如果对象或数组被分配在
new-expression,匹配的释放函数(3.7.3.2、5.3.4、
12.5)(如果有)被调用以释放对象占用的存储空间。
唯一接近您假设的场景(也是我最初假设的)的段落如下。
[2003: 15.4/3]
如果虚拟函数有异常规范,
任何函数的所有声明,包括定义
重写任何派生类中的虚函数只允许
基础异常规范允许的异常
类虚函数。
但显然exception::exception()
不是虚函数,并且显然runtime_error::runtime_error(string const&)
不会覆盖它。
(注意这个场景would申请虚拟析构函数;因此,你可以看到,在 libstdc++ 中,runtime_error::~runtime_error() is throw() http://gcc.gnu.org/onlinedocs/gcc-4.6.0/libstdc++/api/a01044_source.html).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)