构造函数不抛出异常

Kra*_*ken 3 c++ constructor exception 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果在try块中,我使用注释代码,那么它显示正常.

我也尝试过

B b(A(), C());
Run Code Online (Sandbox Code Playgroud)

依然没有.

lub*_*bgr 5

这是一个带有返回类型B,名称b和两个类型的未命名参数的函数声明,A并且C:

B b(A, C);
Run Code Online (Sandbox Code Playgroud)

同样的

B b(A(), C());
Run Code Online (Sandbox Code Playgroud)

因为名称可以用括号括起来(允许分组,在使用例如函数指针等时是必需的),甚至遗漏的名称也可以用括号括起来.你可以把它变成一个变量b类型B

B b(A{}, C{});
Run Code Online (Sandbox Code Playgroud)

花括号初始化变量的动机之一是在这种情况下消除歧义.在这里,它显然派上用场了.