举个例子:
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; })
是否有一个令人信服的理由,为什么我要用这两种修饰语来标记这种表达(或类似的基本表达),或者在这种情况下,最好留下它并且根本不打扰?
< / LI> 醇>答案 0 :(得分:3)
noexcept和空掷规格之间有什么区别......?
是的。
首先想到的是,如果抛出异常会发生什么?
throw()
,则调用std::unexpected()
。 unexpected
的默认处理程序将调用terminate
。noexcept
,则会调用std::terminate()
。第二个是动态异常规范是deprecated。
<强>不赞成强>
noexcept
是throw()
的改进版本,在C ++ 11中已弃用。与throw()
不同,noexcept
不会调用std::unexpected
并且可能会或可能不会展开堆栈,这可能允许编译器实现 {{1}没有noexcept
的运行时开销。。
有没有可信的理由,我为什么要用这两种修饰语来标记这种表达(或类似的基本表达)......?
这是意图的表达。如果你打算从不抛出lambda,如果它确实对程序的执行被认为是致命的,那么是 - 你应该将lambda标记为throw()
(noexcept
已弃用)。
答案 1 :(得分:3)
是的,它们都可以用于声明不抛出任何异常的函数(包括lambdas),但在C ++ 11中已经弃用了dynamic exception specification。 noexcept(与noexcept(true)
)和throw()
相同并不完全相同:
noexcept
是throw()
的改进版本,在C ++ 11中已弃用。与throw()
不同,noexcept
不会调用std::unexpected
并且可能会或可能不会展开堆栈,这可能允许编译器实现noexcept
而没有{{1}的运行时开销}。