构造函数不抛出异常

时间:2019-02-18 08:52:49

标签: c++ exception constructor most-vexing-parse

在下面的代码中,我想测试如果我有一个对象,该对象包含另一个对象,该对象的构造函数会引发异常,将会发生什么情况。但是下面的代码绝对不起作用。控制台上什么也没打印。

class A
{
    public:
        A()
        {
            cout << "in A constructor" << endl;
            throw "error creating A";
        }
        ~A()
        {
            cout << "destructing A" << endl;
        }
};

class C
{
    public:
    C()
    {
        cout <<"in C constructor" << endl;
    }
    ~C()
    {
        cout << "in C destructor " <<  endl;
    }

};

class B
{
    public:
    C c;
    A a;
    B(A a_, C c_): a(a_), c(c_){}
    B(){}
};


int main()
{
    try{
    B b(A, C);
    //B b;
    }
    catch(char const* s)
    {
        cout <<"catching" << endl;
    }
}

如果在try块中,我改用注释的代码,则显示正常。

我也尝试过

B b(A(), C());

什么都没有。

1 个答案:

答案 0 :(得分:5)

这是一个函数声明,其返回类型为B,名称为b,还有两个类型为AC的未命名参数:

B b(A, C);

相同
B b(A(), C());

因为名称可以用括号括起来(以允许分组,这在使用例如函数指针等时是必要的),甚至被遗漏的名称也可以用括号括起来。您可以通过

将其转换为类型为b的变量B
B b(A{}, C{});

在这种情况下,花括号初始化变量的动机之一就是消除歧义。在这里,显然很方便。