class ESClass
{
public:
void PrintMe() throw();
void PrintMe(int) throw(int);
};
Run Code Online (Sandbox Code Playgroud)
我想知道我们是否可以为重载函数定义不同的异常规范.换句话说,我们可以为不同版本的PrintMe提供不同的异常规范吗?
VS2010的注意事项:
警告C4290:忽略C++异常规范,除非指示函数不是__declspec(nothrow)
是的:它们是不同的功能,它们可以有不同的异常规范.
如果虚拟成员函数具有异常规范,则任何覆盖(不重载)必须具有至少与被覆盖的成员函数一样严格的异常规范.
当然,您应该"永远不要编写异常规范",除非在您必须的少数情况下.
Visual C++不完全支持异常规范,因此它允许一些根据C++语言规范实际上无效的代码. 您提到的警告只是意味着您使用的代码使用Visual C++不支持的C++语言功能:
使用异常规范声明函数,Visual C++接受但未实现.编译期间忽略的具有异常规范的代码可能需要重新编译和链接,以便在将来支持异常规范的版本中重用.