C++ 为什么可以指定异常规范的参数类型?

C++ 为什么可以指定异常规范的参数类型?,c++,C++,既然可以抛出另一种类型,为什么可以为throw关键字指定一种类型的参数?例如: class A {}; class B {}; void tryexcept() throw(B*) { B* b = new B(); A* a = new A(); throw (a); // It works pretty smooth? } Int main() { try { tryexcept(); } catch (A* style) {

既然可以抛出另一种类型,为什么可以为throw关键字指定一种类型的参数?例如:

class A {};
class B {};

void tryexcept() throw(B*)
{
    B* b = new B();
    A* a = new A();
    throw (a); // It works pretty smooth?
}
Int main()
{
try {
        tryexcept();
    }
    catch (A* style)
    {
        cout << "in handler for A\n";

    }
    catch (B* style)
    {
        cout << "in handler for B\n";

    }
    catch (...)
    {
        cout << "in handler for everything\n";

    }
return 0;
}
A类{};
B类{};
void tryexcept()抛出(B*)
{
B*B=新的B();
A*A=新的A();
抛出(a);//它运行得很平稳?
}
Int main()
{
试一试{
tryexcept();
}
捕获(A*样式)
{

Cuth

根据微软自己的文档,VisualStudio从C++标准中分离出它如何处理动态异常规范。 它将此情况视为您编写了

void tryexcept()throw()
。在这种情况下,如果使用Visual Studio,则不会调用std::unexpected。Microsoft文档警告说,如果从函数引发异常,程序可能无法正确运行,预期不会发生异常。它似乎已“工作”在这种情况下

C++标准行为应该是STD::如果试图抛出一个未指定类型的异常,则调用NUDT:反过来STD::NULL应该调用TealEnter()。


此功能在C++11及以后版本中已被弃用。

可能与此相关:您使用的编译器似乎没有正确实现异常规范。这是对
unexpected()
的调用,最终是
terminate()
我认为@IgorTandetnik是正确的;这里使用了什么编译器?还要注意动态异常规范(其中
throw(B*)
就是其中之一)在C++中,不使用C++。在新代码中使用它们是不明智的。@ IgorTandetnik,我知道。好吧,但是Visual Studio不应该有一个按预期工作的编译器吗?完全清楚,离开C++标准只在MSVC如何处理<代码>()。
.VS 2015及更高版本支持C++11标准的
noexcept
,并且:“如果异常确实到达标记为noexcept的函数,则会立即调用std::terminate,并且不能保证会调用任何范围内对象的析构函数。”不言而喻,
noexcept
是您应该使用的。旧式的异常规范几乎毫无用处,现在已被弃用。