不扔是零成本的时候,noexcept 是不是没用?

j5w*_*j5w 12 c++ compilation exception noexcept

noexcept如果您的实现具有零成本(如果没有抛出)异常模型,说明符是否无用?什么是缺乏noexcept有后果的例子?

Fra*_*eux 14

noexcept如果您的实现具有零成本(如果没有抛出)异常模型,说明符是否无用?

不,noexcept即使异常根本没有性能影响,也会很有用。

一个例子是noexcept可以表明可以使用哪种算法。例如,使用std::move_if_noexcept或许多标准type_traits 的算法可能会根据noexcept.

这可能会对常见功能产生重大影响,例如std::vector如果元素的移动构造函数不是 ,则速度会慢得多noexceptstd::vector如果移动构造函数不noexcept保留强异常保证,则将在重新分配而不是移动它们时复制所有元素。

  • @lajoh90686 如果您开始移动元素并抛出异常,则无法撤消更改。您有两个数组,每个数组都包含一部分元素,并且您无法确定将它们移回是否有效(因为显然移动可能会失败)。如果您开始复制元素并且抛出异常,您可以丢弃新的部分复制的数组,并保留旧数据。 (4认同)
  • @lajoh90686 几乎任何时候你想确保强大的异常保证 (2认同)