我应该使用noexcept来显示无法抛出的简单函数吗?

时间:2017-01-07 15:34:45

标签: c++ noexcept

"有效的现代C ++"的第14项建议在不发出异常时声明函数noexcept。我有一个具有许多小成员函数的类,它们不能因为非常重要的原因而抛出,例如它们只对POD执行简单的数学运算。我应该声明这些函数noexcept吗?对于我来说,即使编译器确实可以检测到没有可能抛出也似乎有点过分了。

编辑:为了澄清我的问题,this问题中给出的建议是,当明显的功能永远不会抛出时,使用它。"但是,如果该函数永远不会抛出(即使是编译器),为什么要使用noexcept呢?请注意,我必须将我的程序的绝大部分功能标记为noexcept,如果给出令人信服的理由,我将只会这样做。

1 个答案:

答案 0 :(得分:1)

  

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

只有了解函数的定义才能推断出这些知识。调用者可能只包含标题,其中包含声明。没有信息。你最好的机会是链接时优化器注意到隐式noexcept属性并删除异常处理(纯粹谈论理论上的考虑因素,不确定编译器是否实际执行此操作......)。

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

作为旁注,没有noexcept,生活通常都很好,但是除非你有特殊的理由想要使用它,例如公共API,性能敏感的紧密循环,编码标准等,您可以自由地省略它。不要微观优化或浪费时间。