我应该对显然不能抛出的简单函数使用 noexcept 吗?
Should I use noexcept for simple functions that obviously cannot throw?
"Effective Modern C++" 的第 14 项建议在函数不发出异常时声明函数 noexcept
。我有一个 class 有许多小的成员函数,这些函数由于非常微不足道的原因不能抛出,例如他们只对 PODs 执行简单的数学运算。我应该声明这样的函数 noexcept
吗?这对我来说似乎有点过分了,即使编译器肯定能检测到没有抛出的可能性。
编辑:为了稍微澄清我的问题,this 问题中给出的建议是 "use it when it's obvious that the function will never throw." 但是如果很明显(甚至对编译器而言)该函数永远不会抛出,为什么要使用 noexcept
有吗?请注意,我必须将程序中的绝大多数功能标记为 noexcept
,只有在给出令人信服的理由时我才会这样做。
But if it's obvious (even to the compiler) that the function will never throw, why use noexcept at all?
该知识只能通过了解函数的定义来推断。调用者可能只包含 header,其中包含 声明 。那里没有信息。你最好的机会是 link 时间优化器注意到隐式 noexcept
属性 并删除异常处理(纯粹是理论上的考虑,不确定编译器是否真的这样做......)。
当然,这在某些情况下是不可能的,例如,如果您以多态方式使用 object。尽管您的实现是隐式的 noexcept
,但子类的函数可能会抛出异常。
作为旁注,没有 noexcept
的生活通常是美好而花花公子的,所以除非有特定的原因你想使用它,例如a public API,对性能敏感的紧循环,编码标准等,你可以随意省略。不要微优化或浪费时间。
"Effective Modern C++" 的第 14 项建议在函数不发出异常时声明函数 noexcept
。我有一个 class 有许多小的成员函数,这些函数由于非常微不足道的原因不能抛出,例如他们只对 PODs 执行简单的数学运算。我应该声明这样的函数 noexcept
吗?这对我来说似乎有点过分了,即使编译器肯定能检测到没有抛出的可能性。
编辑:为了稍微澄清我的问题,this 问题中给出的建议是 "use it when it's obvious that the function will never throw." 但是如果很明显(甚至对编译器而言)该函数永远不会抛出,为什么要使用 noexcept
有吗?请注意,我必须将程序中的绝大多数功能标记为 noexcept
,只有在给出令人信服的理由时我才会这样做。
But if it's obvious (even to the compiler) that the function will never throw, why use noexcept at all?
该知识只能通过了解函数的定义来推断。调用者可能只包含 header,其中包含 声明 。那里没有信息。你最好的机会是 link 时间优化器注意到隐式 noexcept
属性 并删除异常处理(纯粹是理论上的考虑,不确定编译器是否真的这样做......)。
当然,这在某些情况下是不可能的,例如,如果您以多态方式使用 object。尽管您的实现是隐式的 noexcept
,但子类的函数可能会抛出异常。
作为旁注,没有 noexcept
的生活通常是美好而花花公子的,所以除非有特定的原因你想使用它,例如a public API,对性能敏感的紧循环,编码标准等,你可以随意省略。不要微优化或浪费时间。