【发布时间】:2010-07-12 23:32:30
【问题描述】:
C++ 标准规定了以下关于具有异常规范的虚函数:
如果虚函数具有异常规范,则在任何派生类中覆盖该虚函数的任何函数的所有声明(包括定义)都应只允许允许的异常基类虚函数的>异常规范 (C++03 §15.4/3)。
因此,以下格式不正确:
struct B {
virtual void f() throw() { } // allows no exceptions
};
struct D : B {
virtual void f() { } // allows all exceptions
};
(1) 此规则是否适用于析构函数?也就是说,下面的格式是否正确?
struct B {
virtual ~B() throw() { }
};
struct D : B {
virtual ~D() { }
};
(2) 该规则如何应用于隐式声明的析构函数?也就是说,下面的格式是否正确?
struct B {
virtual ~B() throw() { }
};
struct D : B {
// ~D() implicitly declared
};
虽然在一般情况下应该never write an exception specification,但这个问题具有实际意义,因为std::exception 析构函数是虚拟的并且有一个空的异常规范。
由于不允许从析构函数中抛出异常是一种很好的做法,为了简化任何示例,我们假设析构函数要么允许所有异常(即它没有异常规范),要么不允许异常(也就是说,它有一个空的异常规范)。
【问题讨论】:
标签: c++ exception exception-handling destructor exception-specification