从成员构造函数(Brace Initializer vs Initializer列表)抛出异常

Throwing exception from member constructor (brace initializer vs initializer list)

本文关键字:Initializer vs 列表 抛出异常 Brace 成员 构造函数      更新时间:2023-10-16

我在理解会员对象初始化时(从构造函数(抛出异常时会失去信心(可能是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.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-Inializer 成员initializer-list 在例外情况下初始化成员之间有什么区别?/p>

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

之间没有实际区别
struct P {
    X x {20};
};

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

但是,C 11模式有一个GCC错误(但不是C 14或更高版本(,这会导致p{}的初始化发生在Try-Block之外,或者将noexcept的等效添加到隐式定义的默认值中构造函数 P