C++ 对于显然无法抛出的简单函数,是否应该使用noexcept?

C++ 对于显然无法抛出的简单函数,是否应该使用noexcept?,c++,noexcept,C++,Noexcept,“有效的现代C++”第14项建议在函数不发出异常时声明函数noexcept。我有一个类,它有许多小成员函数,由于非常小的原因不能抛出,例如,它们只对pod执行简单的数学运算。我是否应该声明这样的函数noexcept?在我看来,即使是编译器也肯定能检测到不存在抛出的可能性,这似乎是过火了 编辑:为了稍微澄清我的问题,这里给出的建议是“当函数显然永远不会抛出时使用它。”但是如果函数显然永远不会抛出(甚至对编译器来说),为什么要使用noexcept?请注意,我必须将程序中绝大多数函数标记为noexce

“有效的现代C++”第14项建议在函数不发出异常时声明函数
noexcept
。我有一个类,它有许多小成员函数,由于非常小的原因不能抛出,例如,它们只对pod执行简单的数学运算。我是否应该声明这样的函数
noexcept
?在我看来,即使是编译器也肯定能检测到不存在抛出的可能性,这似乎是过火了

编辑:为了稍微澄清我的问题,这里给出的建议是“当函数显然永远不会抛出时使用它。”但是如果函数显然永远不会抛出(甚至对编译器来说),为什么要使用
noexcept
?请注意,我必须将程序中绝大多数函数标记为
noexcept
,只有在给出令人信服的理由时,我才会这样做

但是如果很明显(甚至对编译器来说)函数永远不会抛出,那么为什么要使用noexcept呢

只有知道函数的定义才能推断出这些知识。调用方可能只包含包含声明的头。那里没有消息。您最好的机会是链接时间优化器注意到隐式的
noexcept
属性,并删除异常处理(纯粹讨论理论上的考虑,不确定编译器是否真的这样做…)

当然,这在某些情况下是不可能的,例如,如果您以多态方式使用对象。尽管您的实现是隐式的
noexcept
,但子类的函数可能会抛出


作为旁注,如果没有
noexcept
,生活通常是美好的,因此除非有特定的原因,您想使用它,例如公共API、性能敏感的紧循环、编码标准等。您可以随意忽略它。不要进行微优化或浪费时间。

@JesperJuhl我以前看到过这个问题,但没有发现它有什么帮助,因为建议简化为“在函数显然永远不会抛出时使用它”,而没有提供任何理由。如果函数显然不会抛出,为什么还要添加
noexcept
?因为它对编译器来说可能不明显,而且它还为API的用户提供了额外的文档。@JesperJuhl我编辑了我的问题以使这一点更清楚,但是对于编译器来说应该很明显,所讨论的函数不能抛出,因为它们仅仅由分支、简单的算术组成,循环等。没有内存分配或任何可能会抛出的东西。@AlessandroPower:你陷入了一个陷阱,根据一个关键字看似由英语单词组成,而不是它的实际定义来解释它
nothrow
并不意味着“此函数中的任何代码都不能抛出”,而是意味着“此函数中不会出现任何异常”。区别体现在两个方面——如果函数捕捉到异常,则完全允许有确实抛出的代码。通常,编译器很容易推断函数是否内在泄漏异常,但外部异常,尤其是在存在多态性或间接性的情况下,需要注释(
nothrow
关键字)。