[英]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-initializer和member-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.