我听说noexcept
关键字更像'它永远不应该抛出异常',而不是'它没有'。
如果我不确定它是否会引发异常,我认为使用noexcept
关键字并不好,但noexcept
关键字有时与移动构造函数中的性能相关。
所以我尝试使用noexcept
限定符,但如果它在定义中有多个语句就会变得更难,它会成为一种复制和粘贴的东西。
template <class T>
void f(T&& t)
noexcept(noexcept(statement_1) &&
noexcept(statement_2) &&
noexcept(statement_3) &&
noexcept(statement_4) &&
noexcept(statement_5))
{
statement_1;
statement_2;
statement_3;
statement_4;
statement_5;
}
我认为编译器可以判断函数的定义是否包含非抛出语句,因此如果有noexcept
之类的表达式,则更容易使用noexcept(auto)
,但似乎标准中没有这样的东西。
有没有办法简化noexcept表达式?
答案 0 :(得分:9)
目前没有。但是,有一个关于该主题的提案,其中提出noexcept(auto)
语法:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4473
根据Botond Ballo的“旅行报告:2015年5月Lenexa的C ++标准会议”https://botondballo.wordpress.com/2015/06/05/trip-report-c-standards-meeting-in-lenexa-may-2015/
进一步的工作。该提案的方向很有希望,但它要么不够充实,要么对一个或多个设计点有特定关注。鼓励作者回来修改后的提案更加充实和/或解决所述问题。
...
noexcept(auto),这基本上意味着“从它调用的函数的noexcept-ness中推导出该函数的noexcept-ness。与返回类型推导一样,这要求在使用该功能的每个翻译单元中可以使用该功能的主体。提出这一点,以及将异常规范作为类型系统的一部分的提议,这意味着修改函数的主体可以改变函数的类型(再次类似于返回类型推导),但人们并不过分关注这一点。