重载函数的C++异常规范

q09*_*987 4 c++

class ESClass
{
public:
    void PrintMe() throw();
    void PrintMe(int) throw(int);
};
Run Code Online (Sandbox Code Playgroud)

我想知道我们是否可以为重载函数定义不同的异常规范.换句话说,我们可以为不同版本的PrintMe提供不同的异常规范吗?

VS2010的注意事项:

警告C4290:忽略C++异常规范,除非指示函数不是__declspec(nothrow)

Jam*_*lis 9

是的:它们是不同的功能,它们可以有不同的异常规范.

如果虚拟成员函数具有异常规范,则任何覆盖(不重载)必须具有至少与被覆盖的成员函数一样严格的异常规范.

当然,您应该"永远不要编写异常规范",除非在您必须的少数情况下.

Visual C++不完全支持异常规范,因此它允许一些根据C++语言规范实际上无效的代码. 您提到的警告只是意味着您使用的代码使用Visual C++不支持的C++语言功能:

使用异常规范声明函数,Visual C++接受但未实现.编译期间忽略的具有异常规范的代码可能需要重新编译和链接,以便在将来支持异常规范的版本中重用.