如何正确地推论函数的异常性?

时间:2018-07-13 12:24:32

标签: c++ c++17 noexcept copy-elision

在一般情况下,通常我们会写类似

return_type f(arg_type1 arg1, ...)
  noexcept(noexcept(statement_1) && noexcept(statement_2) && ... && noexcept(statement_n))
{
  statement_1;
  statement_2;
  ...
  statement_n;
}

statement_k是return语句时,事情就不那么简单了。不可能写noexcept(return expr)。相反,我应该理解当我们说return expr时发生了什么,并将其分解为几个noexcept(something)。但这似乎并不平凡。

我想出了类似以下算法的东西:

  1. 如果return_type是引用类型,那么noexcept(expr)当然就足够了。
  2. 如果return_type不是引用类型,但是如果return expr是发生保证复制删除的情况,则noexcept(expr)再次满足。
  3. 否则,noexcept(expr) && std::is_nothrow_move_constructible<return_type>::value && std::is_nothrow_destructible<return_type>::value

对吗?还是有更简单的方法?情况1被视为情况3的特例,但是情况2和3呢?

0 个答案:

没有答案