以下似乎是在我试过的几个编译器上编译的:
class A
{
public:
virtual void foo() throw() = 0;
};
class B : public A
{
public:
virtual void foo() noexcept override { }
};
Run Code Online (Sandbox Code Playgroud)
似乎可以使用较新的noexcept规范覆盖throw()函数.我也尝试了相反的方法(用throw()覆盖noexcept)它似乎工作.这是为什么?这是未定义的行为还是允许的?
请注意,代码生成受noexcept vs throw()的影响.它们也没有相同的行为,因为noexcept调用与throw()不同的终止函数.一个理想的答案将说明行为的差异以及在这种情况下它们为何或不重要.
我只是在视觉工作室中使用异常,并且使用上面的代码我期待,因为我的异常规范没有提到任何应该抛出bad_exception的内容.但实际发生的是异常被适当的处理程序捕获.为什么这样?我错过了IDE中的某些设置或其他内容吗?
虽然我被困在上面提到的,实际上我试图找到问题的答案,如果我有一个例外空白规范然后被称为什么?在意外()方法或*bad_exception*将如果双方以什么顺序来抛出?这是代码.
#include "stdafx.h"
#include <stdio.h>
#include <exception>
#include <iostream>
using namespace std;
class A
{
public:
int i;
};
void myunexpected ()
{
cerr << "unexpected called\n";
}
void doSomething(void) throw();
void doSomething(void) throw()
{
A obj;
obj.i= 100;
throw obj;
}
int _tmain(int argc, _TCHAR* argv[])
{
set_unexpected (myunexpected);
try
{
doSomething();
}
catch (bad_exception be)
{
puts("Caught something");
}
catch (A &obj)
{
puts("Caught Integer");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)