Pra*_*tic 15 c++ exception c++17
我刚注意到了
http://en.cppreference.com/w/cpp/error/uncaught_exception
C++ 17将替换std::uncaught_exception(),返回a bool,with std::uncaught_exceptions(),返回一个int.
描述这个的标准的补充在这里:
http://isocpp.org/files/papers/n4259.pdf
它没有提供理由,但确实如此
[注意:当uncaught_exceptions()> 0时,抛出异常会导致调用std :: terminate()(15.5.1). - 结束说明]
这是奇怪的模糊.
这种变化的原因是什么?在C++ 17或标准的某些未来版本中,是否可以有多个活动异常?
Cub*_*bbi 22
介绍这个的论文是n4152,它有基本原理(通常归结为"使ScopeGuard工作")
报价,
至少自1998年以来在第47周的Guru中记录,它意味着从析构函数传递调用的代码本身可以在堆栈展开期间调用,但无法正确检测它本身是否实际被作为展开的一部分进行调用.一旦你正在解除任何异常
uncaught_exception,即使有多个活动异常,所以看起来就像展开一样.
和
这使用了主要实现中已经存在的信息,其中ScopeGuard的当前实现采用依赖于未记录的编译器功能的非便携代码,以使ScopeGuard在"实践中可移植".此选项建议添加一个新函数以公开已存在于编译器中的信息,以便这些用途可以真正可移植
PS:以下是使用编译器特定信息如何实现此功能的示例:https://github.com/panaseleus/stack_unwinding/blob/master/boost/exception/uncaught_exception_count.hpp
而对于一个使用它的简单示例,请看boost.log的"记录泵"(参见boost/log/detail/format.hpp和boost/log/sources/record_ostream.hpp):它可以BOOST_LOG(lg) << foo();记录如果foo不抛出,它会创建保护对象的析构函数,也就是说,如果调用析构函数时飞行中的异常数量不大于调用构造函数时的异常数量.
| 归档时间: |
|
| 查看次数: |
2474 次 |
| 最近记录: |