繁体   English   中英

从成员构造函数抛出异常(大括号初始化程序与初始化程序列表)

[英]Throwing exception from member constructor (brace initializer vs initializer list)

我在理解在成员对象初始化期间抛出异常(来自构造函数)时发生的事情时,我已经失去了信心(可能还有2个小时)。

让我告诉你一个例子:

int init (int f) {
    throw f;
}

struct X {
    X (int f) : n {init (f)} {}
    int n;
};

struct P {
    X x {20};
};

和用法:

int main (int argc, char** argv) {
    try {
        P p {};
    }
    catch (int n) {
        std::cout << n << "\n";
    }
}

这段代码(C ++ 11模式)编译得很好(使用GCC 7.2.1),在Linux(Centos 7.4.1708)下我得到:

terminate called after throwing an instance of 'int'
[1]    1242 abort (core dumped)  ./main

问题是: 为什么? 为什么没有catch()部分?

我已经跟踪了这个问题,这意味着当我的P类看起来有点不同时:

struct P {
    P (int f) : x {f} {}
    X x;
};

并以这种形式初始化p对象: P p {20}结果是:20,这是预期的, 没有核心转储

有人可以解释一下,在异常情况下使用brace-or-equal-initializermember-initializer-list 初始化 成员有什么区别?

错误报告: https//gcc.gnu.org/bugzilla/show_bug.cgi? id = 85363

以下之间应该没有实际区别:

struct P {
    X x {20};
};

struct P {
    P() : x{20} { }
    X x;
};

但是C ++ 11模式(但不是C ++ 14或更高版本)存在GCC错误 ,导致p{}的初始化发生在try-block之外,或者将noexcept的等价物添加到隐式定义的默认构造函数中为P

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM