从成员构造函数(Brace Initializer vs Initializer列表)抛出异常
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.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
。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 从成员构造函数(Brace Initializer vs Initializer列表)抛出异常