C++ 当不投入是零成本时,noexcept是无用的吗?

C++ 当不投入是零成本时,noexcept是无用的吗?,c++,exception,compilation,noexcept,C++,Exception,Compilation,Noexcept,如果您的实现具有零成本(如果没有抛出任何异常)异常模型,那么noexcept说明符是否无用?缺少noexcept会导致什么后果 如果您的实现具有零成本(如果没有抛出任何异常)异常模型,那么noexcept说明符是否无用 不,noexcept将非常有用,即使异常对性能没有任何影响 一个例子是,noexcept可以指示可以使用哪种算法。例如,根据noexcept的存在,使用或使用许多标准的算法可能会表现出不同的行为 这可能会对诸如std::vector之类的常见功能产生重大影响,如果元素的移动构造函

如果您的实现具有零成本(如果没有抛出任何异常)异常模型,那么
noexcept
说明符是否无用?缺少
noexcept
会导致什么后果

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

不,
noexcept
将非常有用,即使异常对性能没有任何影响

一个例子是,
noexcept
可以指示可以使用哪种算法。例如,根据
noexcept
的存在,使用或使用许多标准的算法可能会表现出不同的行为


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

如果两个元素都可以抛出,为什么要复制呢?@lajoh90686如果开始移动元素,一个抛出,则无法撤消更改。您有两个数组,每个数组都包含一部分元素,您不能确定将它们向后移动是否有效(因为移动可能会失败)。如果您开始复制元素,其中一个元素会抛出,那么您可以丢弃新的部分复制的数组,并保留旧数据。有趣。因此,对于移动语义,它是有用的。还有什么?@lajoh90686几乎在任何时候都可以确保强异常得到保证: