39

我听说这个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 表达式?

4

1 回答 1

18

目前没有。但是,有一个关于该主题的提案,其中提出了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。与返回类型推导一样,这要求函数的主体在使用该函数的每个翻译单元中都可用。有人提出,连同将异常规范作为类型系统的一部分的提议,这意味着修改函数的主体可以改变函数的类型(再次类似于返回类型推导),但人们并没有过度关注那。

于 2015-06-09T09:10:48.960 回答