抛出抛出对象的复制构造函数 - 为什么还抛出抛出的对象?

时间:2017-05-28 17:23:50

标签: c++ exception

请注意以下代码:

struct exception_in_copy_constructor
{
    exception_in_copy_constructor() = default;
    ~exception_in_copy_constructor() = default;
    exception_in_copy_constructor(const exception_in_copy_constructor& other) 
    { 
        throw std::exception(":-(");
    }
};

现在很明显,当我抛出这个对象时,会抛出一个std :: exception。

让我们看看下面的代码:

try
{    
    exception_in_copy_constructor ecc;
    throw ecc;
}
catch(exception_in_copy_constructor& ecc)
{
    printf("IN exception_in_copy_constructor&\r\n");
}
catch(std::exception& ex)
{
    printf("IN std::exception&\r\n");
}

我希望在抛出ecc之前,会抛出一个std :: exception,因此,ecc永远不会被抛出。上面的代码确认通过打印" IN std :: exception&"

请注意以下代码:

try
{    
    exception_in_copy_constructor ecc;
    throw ecc;
}
catch(exception_in_copy_constructor& ecc)
{
    printf("IN exception_in_copy_constructor&\r\n");
}

我希望没有会被抓住,但令我惊讶的是,catch(exception_in_copy_constructor& ecc)抓住了异常(?!?!)

有人可以解释发生了什么吗?

我正在使用VS2015

谢谢!

编辑:用户写道他们无法重现,所以我正在编写整个代码,因为它在我的计算机上。 另外,我使用的是VS2015,debug,x64(它还在发行版中重现)。

以下是代码:

int main()
{
    struct exception_in_copy_constructor
    {
        exception_in_copy_constructor() = default;
        ~exception_in_copy_constructor() = default;
        exception_in_copy_constructor(const exception_in_copy_constructor& other)
        {
            throw std::exception(":-(");
        }
    };

    try
    {
        exception_in_copy_constructor ecc;
        throw ecc;
    }
    catch(exception_in_copy_constructor&)
    {
        printf("We will never get here!\r\n");
    }

    return 0;
}

0 个答案:

没有答案