举个例子:
double values[] {2.5, -3.5, 4.5, -5.5, 6.5, -7.5};
std::vector<double> squares(std::end(values) - std::begin(values));
std::transform(std::begin(values), std::end(values), std::begin(values), std::begin(squares),
[](double x1, double x2) throw() { return x1 * x2; });
-
这在功能上等同于以下内容吗?
[](double x1, double x2) noexcept { return x1 * x2; })
是否有一个令人信服的理由,为什么我应该用修饰符标记这样的表达式(或类似的基本表达式),或者在这种情况下,最好保留它并且不要打扰?
noexcept 和empty throw 规范之间有什么区别吗...?
就在这里。
我想到的第一个区别是如果抛出异常会发生什么?
- 如果是
throw()
, std::unexpected() http://en.cppreference.com/w/cpp/error/unexpected叫做。默认处理程序unexpected
将会通知terminate
.
- 如果是
noexcept
, std::terminate() http://en.cppreference.com/w/cpp/error/terminate叫做。
第二个是动态异常规范是已弃用 http://en.cppreference.com/w/cpp/language/noexcept_spec#Deprecates.
弃用
noexcept
是一个改进版本throw()
,它在 C++11 中已弃用。不像throw()
, noexcept
不会打电话std::unexpected
并且可能会也可能不会展开堆栈,这可能允许编译器实现noexcept
没有运行时开销throw()
.
有一个令人信服的理由,为什么我应该用其他修饰符来标记这样的表达式(或类似的基本表达式)......?
这是意图的表达。如果您希望 lambda 永远不会抛出,并且如果抛出,则被认为对程序的执行是致命的,那么是的 - 您应该将 lambda 标记为noexcept
(throw()
已弃用)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)