lambda表达式的noexcept和空掷规范之间有什么区别吗?

时间:2016-05-25 09:44:11

标签: c++ lambda noexcept

举个例子:

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; });
  1. 这在功能上与以下内容相同吗?

    [](double x1, double x2) noexcept { return x1 * x2; })
    
  2. 是否有一个令人信服的理由,为什么我要用这两种修饰语来标记这种表达(或类似的基本表达),或者在这种情况下,最好留下它并且根本不打扰?

    < / LI>

2 个答案:

答案 0 :(得分:3)

  

noexcept和空掷规格之间有什么区别......?

是的。

首先想到的是,如果抛出异常会发生什么?

第二个是动态异常规范是deprecated

  

<强>不赞成

     

noexcept throw()的改进版本,在C ++ 11中已弃用。与throw()不同, noexcept 不会调用std::unexpected并且可能会或可能不会展开堆栈,这可能允许编译器实现 {{1}没有noexcept的运行时开销。

  

有没有可信的理由,我为什么要用这两种修饰语来标记这种表达(或类似的基本表达)......?

这是意图的表达。如果你打算从不抛出lambda,如果它确实对程序的执行被认为是致命的,那么是 - 你应该将lambda标记为throw()noexcept已弃用)。

答案 1 :(得分:3)

是的,它们都可以用于声明不抛出任何异常的函数(包括lambdas),但在C ++ 11中已经弃用了dynamic exception specificationnoexcept(与noexcept(true))和throw()相同并不完全相同:

  

noexceptthrow()的改进版本,在C ++ 11中已弃用。与throw()不同,noexcept不会调用std::unexpected并且可能会或可能不会展开堆栈,这可能允许编译器实现noexcept而没有{{1}的运行时开销}。