gpt4 book ai didi

c++ - 从成员构造函数中抛出异常(大括号初始值设定项与初始值设定项列表)

转载 作者:可可西里 更新时间:2023-11-01 16:47:11 26 4
gpt4 key购买 nike

我对自己在初始化成员对象期间(从构造函数)抛出异常时发生的情况的理解失去了信心(可能有 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;
};

但是有一个GCC bug对于导致 p{} 初始化的 C++11 模式(但不是 C++14 或更高版本)发生在 try block 之外,或添加相当于 noexcept 的内容隐式定义的默认构造函数 P .

关于c++ - 从成员构造函数中抛出异常(大括号初始值设定项与初始值设定项列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com