class ESClass
{
public:
void PrintMe() throw();
void PrintMe(int) throw(int);
};
我想知道我们是否可以为重载函数定义不同的异常规范。换句话说,我们可以为不同版本的PrintMe函数提供不同的异常规范吗?
VS2010的注释:
警告C4290:除了指示外,忽略C ++异常规范 函数不是__declspec(nothrow)
答案 0 :(得分:9)
是:它们是不同的功能,它们可以有不同的异常规范。
如果虚拟成员函数具有异常规范,则任何覆盖(不是重载)必须具有至少与被覆盖的成员函数一样严格的异常规范
当然,除了"never write an exception specification"之外,您应该those few situations where you must。
Visual C ++不完全支持异常规范,因此它允许一些根据C ++语言规范实际上无效的代码。 The warning you mention只是意味着您使用的代码使用的是Visual C ++不支持的C ++语言功能:
使用异常规范声明函数,Visual C ++接受但未实现。在编译期间忽略的具有异常规范的代码可能需要重新编译和链接,以便在将来支持异常规范的版本中重用。