在一般情况下,通常我们会写类似
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)
。但这似乎并不平凡。
我想出了类似以下算法的东西:
return_type
是引用类型,那么noexcept(expr)
当然就足够了。return_type
不是引用类型,但是如果return expr
是发生保证复制删除的情况,则noexcept(expr)
再次满足。noexcept(expr) && std::is_nothrow_move_constructible<return_type>::value && std::is_nothrow_destructible<return_type>::value
。对吗?还是有更简单的方法?情况1被视为情况3的特例,但是情况2和3呢?