【问题标题】:Constructor not throwing exception [duplicate]构造函数不抛出异常[重复]
【发布时间】:2019-07-11 14:41:40
【问题描述】:

在下面的代码中,我想测试如果我有一个对象会发生什么,该对象包含另一个构造函数抛出异常的对象。但是下面的代码完全没有任何作用。控制台上根本没有打印任何内容。

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());

还是什么都没有。

【问题讨论】:

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


【解决方案1】:

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

B b(A, C);

同样的

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2016-08-31
    相关资源
    最近更新 更多